题目链接:https://vjudge.net/problem/HDU-2685
这道题要知道这个公式:
gcd(am-1,an-1) = agcd(m,n)-1
推广:
若 gcd(a,b)=1
gcd(am-bm,an-bn) = agcd(m,n)-bgcd(m,n)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int k;
ll pow(ll a,ll b)
{
ll res=1;
while(b)
{
if(b&1) res=res*a%k;
a=a*a%k;
b>>=1;
}
return res%k;
}
ll gcd(ll a,ll b)
{
if(b==0)
{
return a;
}
return gcd(b,a%b);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll a,m,n;
scanf("%lld%lld%lld%lld",&a,&m,&n,&k);
ll ans1=pow(a,gcd(m,n)); ///(a - b) % p = (a % p - b % p ) % p
printf("%lld\n",(ans1-1+k)%k);
}
}