马上区域赛网络赛了,整理了一些公式,本题是一个公式的模板题。
公式:
gac(am−bm,an−bn)=agcd(m,n)−bgcd(m,n)
公式变形:
gcd(am−1,an−1)=agcd(m,n)−1
直接套公式做就好了
code:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<string>
#include <set>
//a&3==a%4
using namespace std;
#define ll long long
#define mem(a) memset(a,0,sizeof(a))
const double eps=1e-8;
const int maxn=30010;//须填写
const int inf=0x3f3f3f3f;
int read() { //输入外挂
int res = 0;
bool flag =false;
char ch;
if((ch = getchar()) == '-') flag = true;
else if(ch >= '0' && ch <= '9') res = ch - '0';
while((ch = getchar()) >= '0' && ch <= '9')
res = res * 10 + (ch - '0');
return flag ? -res : res;
}
int mod;
int gcd(int x,int y)
{
if(y==0) return x;
else return(gcd(y,x%y));
}
int quickpow(int a,int b)
{
int ans=1;
while(b)
{
if(b&1)
{
ans=(ans*a)%mod;
b--;
}
b=b>>1;
a=(a*a)%mod;
}
ans=ans%mod;
return ans;
}
int main()
{
int kase;
int a,m,n;
kase=read();
while(kase--)
{
a=read();
m=read();
n=read();
mod=read();
int pow=gcd(m,n);
int res=(quickpow(a,pow)+mod-1)%mod;//这里要处理一下,不然可能出现负数
// cout<<pow<<endl;
cout<<res<<endl;
}
return 0;
}
//寇瑟茹酒