证明起来貌似有点麻烦,背下来好了
【例题】P5091 【模板】扩展欧拉定理
【代码】
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int a,m;
int calcphi(int x)
{
int res=x,xx=x;
for(int i=2;i*i<=x;i++)
{
if(xx%i==0)
{
res=res/i*(i-1);
while(xx%i==0) xx/=i;
}
}
if(xx>1) res=res/xx*(xx-1);
return res;
}
typedef long long ll;
ll qpow(ll x,ll y)
{
ll res=1;
while(y)
{
if(y&1) res=(1LL*res*a)%m;
a=(1LL*a*a)%m;
y>>=1;
}
return res;
}
int main()
{
freopen("eular.in","r",stdin);
freopen("eular.out","w",stdout);
scanf("%d%d",&a,&m);
int phi=calcphi(m);
char cc;
while(cc!='-' && (cc<'0' || cc>'9')) cc=getchar();
int val=0,flag=0;
for(;isdigit(cc);cc=getchar())
{
val=val*10+cc-'0';
if(val>=phi)
{
val%=phi;
flag=1;
}
}
if(flag) val+=phi;
printf("%lld",qpow(a,val));
return 0;
}