绝对的数论,之前想简单了
求a^(b^c)%317000011
很明显要用快速幂,而且是两次,但是具体要怎么算这两次呢?
要证明即使你这么算了也不影响最后的结果,即同余性不会改变。
这里用到了费马小定理a^p≡a%p(p为素数):
证明 a^(b^c)%p=a^((b^c)%(p-1))%p成立
b^c=r(p-1)+s ---s=b^c%(p-1)
应用费马小定理:
a^(b^c)≡a^(r*(p-1)+s)≡a^(r*(p-1))*a^s≡(a^p*a^s)modp≡a^smodp
因此上面的式子得证
quickPow(a,quickPow(b,c,k-1),k),也是最关键的地方的由来
#include <iostream>
using namespace std;
const long long k=317000011;
long long quickPow(long long m,long long n,long long k)
{
long long res=1;
while(n)
{
if(n&1)
res=(res*m)%k;
n=n>>1;
m=(m*m)%k;
}
return res;
}
int main()
{
long long a,b,c;
int T;
cin>>T;
while(T--)
{
cin>>a>>b>>c;
cout<<quickPow(a,quickPow(b,c,k-1),k)<<endl;
}
}