#include <stdio.h>
int qpow(int b, int e,int s)//快速幂
{
int a = 1,c;
for(int i=e;i;i>>=1)//简化计算次数将1,2,3,4……变成2^1,2^2,2^3,2^4……
{
if(i&1) a=(long long)a * b % s;
//i&1:按位与运算二进制1有8位数00000001,二进制i有XXXXXXXX若最后一个X为1则输出1否则为0相当于i%2==1
b=(long long)b*b%s;
}
return a;
}
int main()
{
char ch;
int k;
int i,b=0,a,n,m,s,ans;
scanf("%d %d",&a,&m);
a=a%m;
ans=m;
n=m;
s=m;
for(i=2;i*i<=n;i++)//查找
{
if(n%i==0)
{
ans*=(i-1.0)/i;//定义公式
while(n%i==0) n/=i*1.0;//找出n的因数中与i互质的最大因数
}
}
if(n>1) ans*=(n-1)*1.0/n;//补充for循环中漏掉的质因数
int flag=0;
getchar();//消除空格
while((ch = getchar()) >= '0' && ch <= '9')
{
b=b*10+(ch^'0');//将ch转化为整数类型
if(b>=ans)//判断选择扩展欧拉定理>=phi(m)部分还是<phi(m)部分
{
flag=1;
b=b%ans;
}
}
if(flag==1) b+=ans;
printf("%d",qpow(a,b,s));
return 0;
}
扩展欧拉定理实战,今日份学习



京公网安备 11010502036488号