(mod m)=A^(x%+) (mod m);
当x>=时等式成立;
分两种情况:
x>=用公式化简
如果小于直接快速幂求解
代码:
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
#define PI acos(-1)
typedef long long ll;
using namespace std;
const int INF = 0x3f3f3f3f;
const ll N=1e6+10;
char ss[N];
ll Phi(ll n)
{
ll t=n;
for(ll i=2;i*i<=n;i++)
{
if(n%i==0)
{
t=t-t/i;
while(n%i==0)n=n/i;
}
}
if(n!=1)t=t-t/n;
return t;
}
ll Pow(ll base,ll n,ll mod)
{
base=base%mod;
ll result=1;
while(n>0)
{
if(n&1)result=result*base%mod;
base=base*base%mod;
n>>=1;
}
return result;
}
void solve(ll A,char ss[],ll C)
{
ll phi=Phi(C),len=strlen(ss);
ll result=0;
for(ll i=0;i<len;i++)
{
result=result*10+ss[i]-'0';
if(result>=phi)break;
}
if(result>=phi)
{
result=0;
for(ll i=0;i<len;i++)
{
result=result*10+ss[i]-'0';
result=result%phi;
}
result=result+phi;
printf("%lld\n",Pow(A,result,C));
}
else printf("%lld\n",Pow(A,result,C));
}
int main()
{
ll A,C;
while(~scanf("%I64d",&A))
{
scanf("%s",ss);
scanf("%I64d",&C);
solve(A,ss,C);
}
}