费马小定理,我好像一开始只看了皮毛,只看了简单的乘法逆元,因为一般的都是x^p=x(mod p)p是素数。如果p不是素数应该怎么办?欧拉定理可以解决这个问题,假设m=p1^e1*p2^e2...pn^en.x^h(m)=1(mod p).数学符号打不出来,想看详细的去百度吧。
#include <bits\stdc++.h>
using namespace std;
long long n,m;
long long euler_phi(long long n)
{
long long res=n;
for(long long i=2;i*i<=n;i++)
{
if(n%i==0)
{
res=res/i*(i-1);
for(;n%i==0;n/=i);
}
}
if(n!=1)res=res/n*(n-1);
return res;
}
long long pow_mod(long long a,long long b)
{
long long ans=1;
while(b>0)
{
if(b&1)ans*=a;
ans%=m;
// cout<<a<<" "<<ans<<endl;
a=(a*a)%m;
b/=2;
}
return ans;
}
int main(){
cin>>n>>m;
cout<<pow_mod(n,euler_phi(m)-1)<<endl;
return 0;
}