题意为:求A的B次方模C的值,B小于等于10^1000000,B过大我们可以采用欧拉函数来进行降幂。如下图
第一步因为欧拉函数求下来答案不大,所以将B作为字符串,从最高位开始,边转换为数字,边取模于欧拉函数算出来的值t,简洁快速也不会爆long long,这样也是高精模低精的常见方法。算出来之后再加上一个t。
第二步进行二进制快速幂运算,即可AC。
下附AC代码。
#include<iostream>
#include<string.h>
using namespace std;
long long MOD;
long long quickmul(long long n,long long k)
{
long long ans=0;
while(k)
{
if(k&1)
{
ans=(ans+n)%MOD;
}
n=(n+n)%MOD;
k=k>>1;
}
return ans%MOD;
}
long long quickpow(long long n,long long k)
{
long long ans=1;
while(k)
{
if(k&1)
{
ans=quickmul(ans,n);
}
n=quickmul(n,n);
k=k>>1;
}
return ans%MOD;
}
long long euler(long long n)
{
long long res=n,a=n;
for(long long i=2;i*i<=a;i++)
{
if(a%i==0)
{
res=res/i*(i-1);
while(a%i==0) a/=i;
}
}
if(a>1) res=res/a*(a-1);
return res;
}
long long N;
string s;
int main()
{
while(cin>>N>>s>>MOD)
{
long long len=s.size();
long long res=0;
long long eu=euler(MOD);
for(long long i=0;i<len;i++)
{
res=res*10+s[i]-'0';
res%=eu;
}
res+=eu;
cout<<quickpow(N,res)<<endl;
}
}