Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- x=0;T k=1;char gc;
- while(!isdigit(c)){if(c=='-')k=-1;gc;}
- while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
- }
- int A,B,p;
- ll n;
- inline int add(int a,int b){
- return (a+=b)>=p?a-p:a;
- }
- inline int sub(int a,int b){
- return (a-=b)<0?a+p:a;
- }
- struct Num{
- int x,y;
- inline Num operator - (const Num &a)const {
- return Num{sub(x,a.x),sub(y,a.y)};
- }
- inline Num operator * (const Num &a)const {
- return Num{((ll)x*a.x+(ll)y*a.y%p*B)%p,((ll)a.y*x+(ll)a.x*y)%p};
- }
- };
- inline Num qpow(Num a,ll b){
- Num ans{1,0};
- while(b){
- if(b&1)ans=ans*a;
- a=a*a;
- b>>=1;
- }
- return ans;
- }
- int main(){
- int T;r(T);
- while(T--){
- r(A),r(B),r(n),r(p);
- int x=A;
- int y=1;
- for(int i=2;i*i<=B;++i){
- while(B%(i*i)==0){
- B/=(i*i);
- y*=i;
- }
- }
- x%=p;
- y%=p;
- printf("1 %d %d\n",qpow(Num{x,y},n).y,B);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment