yicongli

HDU6442

Mar 17th, 2019
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.11 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. int A,B,p;
  17. ll n;
  18.  
  19. inline int add(int a,int b){
  20.     return (a+=b)>=p?a-p:a;
  21. }
  22.  
  23. inline int sub(int a,int b){
  24.     return (a-=b)<0?a+p:a;
  25. }
  26.  
  27. struct Num{
  28.     int x,y;
  29.  
  30.     inline Num operator - (const Num &a)const {
  31.         return Num{sub(x,a.x),sub(y,a.y)};
  32.     }
  33.  
  34.     inline Num operator * (const Num &a)const {
  35.         return Num{((ll)x*a.x+(ll)y*a.y%p*B)%p,((ll)a.y*x+(ll)a.x*y)%p};
  36.     }
  37. };
  38.  
  39. inline Num qpow(Num a,ll b){
  40.     Num ans{1,0};
  41.     while(b){
  42.         if(b&1)ans=ans*a;
  43.         a=a*a;
  44.         b>>=1;
  45.     }
  46.     return ans;
  47. }
  48.  
  49. int main(){
  50.     int T;r(T);
  51.     while(T--){
  52.         r(A),r(B),r(n),r(p);
  53.         int x=A;
  54.         int y=1;
  55.         for(int i=2;i*i<=B;++i){
  56.             while(B%(i*i)==0){
  57.                 B/=(i*i);
  58.                 y*=i;
  59.             }
  60.         }
  61.         x%=p;
  62.         y%=p;
  63.         printf("1 %d %d\n",qpow(Num{x,y},n).y,B);
  64.     }
  65. }
Advertisement
Add Comment
Please, Sign In to add comment