互质:gcd(a,b)=1,则a,b互质
欧拉函数φ(n):小于等于n的所有数中与n互质数的个数
对于互质的正整数a和n,有a^φ(n) ≡ 1(mod n)
///直接求解一个数n的欧拉函数
int euler(int n){ //返回euler(n)
int res=n,a=n;
for(int 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;
}
///求解1到n每个数的欧拉函数
void init()
{
euler[1]=1;
for(int i=2; i<Max; i++)
euler[i]=i;
for(int i=2; i<Max; i++)
if(euler[i]==i)
for(int j=i; j<Max; j+=i)
euler[j]=euler[j]/i*(i-1);
///先进行除法是为了防止中间数据的溢出
}
a^b % p = (a%p)^(b%φ(p)) % p
如果p是质数:
a^b % p = (a%p)^(b%(p-1)) % p
无论p互不互质:
a^b % p = (a%p)^(φ§+b%φ§) % p