(a^b^c)%p a,b,c都比较大时 用欧拉函数结合快速幂来做
欧拉定理:
在数论中,欧拉定理(也称费马-欧拉定理)是一个关于同余的性质。
欧拉定理表明,若n,a为正整数,且n,a互素, (a,n) = 1,则 a^φ(n) ≡ 1 (mod n)
其中φ(n)=nT(1-1/x)其中x是n的因子
费马小定理:
费马小定理是数论中的一个重要定理,其内容为:
假如p是质数,且(a,p)=1,那么 a^(p-1) ≡1(mod p) 假如p是质数,且a,p互质,那么 a的(p-1)次方除以p的余数恒等于1
A^B%C = A^(B%phi(C)+phi(C))%C
这题模数刚好是质数
#include<stdio.h>
#include<math.h>
#define Mod 317000011
int euler(int x)
{
return x-1;
}
int ex(int a,int b,int mod)
{
long long res=1;
long long x=a;
for(;b;b>>=1)
{
if(b&1)
res=(res*x)%mod;
x=(x*x)%mod;
}
return res;
}
int main()
{
int t;
scanf("%d",&t);
int mod=euler(Mod);
while(t--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
int x=ex(b,c,mod);
x+=mod;
int y=ex(a,x,Mod);
printf("%d\n",y);
}
return 0;
}
下面是求欧拉函数的模板
unsigned euler(unsigned x)
{// 就是公式
unsigned i, res=x;
for (i = 2; i < (int)sqrt(x * 1.0) + 1; i++)
if(x%i==0) {
res = res / i * (i - 1);
while (x % i == 0) x /= i; // 保证i一定是素数
}
if (x > 1) res = res / x * (x - 1);
return res;
}