一、快速幂取模
/******快速幂取模******/
int f(int a,int b,int n)
{
int t,y;
t=1;
y=a;
while(b!=0)
{
if(b&1==1)
{
t=t*y%n;
}
y=y*y%n;
b=b>>1;
}
return t;
}
int main()
{
int a,b,n;
while(scanf("%d%d%d",&a,&b,&n)!=EOF)
{
printf("%d\n",f(a,b,n));
}
return 0;
}
二、幂取模
/********幂取模*******/
int pow_mod1(int a,int n,int m) //O(n);
{
int ans=1;
for(int i=0;i<n;i++)
{
ans=(int)((long long)ans*a%m);
}
return ans;
}
int pow_mod2(int a,int n,int m) //O(logn),类似二分的分治法,递归;
{
if(n==0)
return 1;
int x=pow_mod2(a,n/2,m);
long long ans=(long long )x*x%m;
if(n%2==1)
ans=ans*a%m;
return (int)ans;
}
int main()
{
int a,n,x;
while(scanf("%d%d%d",&a,&n,&x)!=EOF)
{
printf("pow_mod1():");
printf("%d\n",pow_mod1(a,n,x));
printf("pow_mod2():");
printf("%d\n",pow_mod2(a,n,x));
}
return 0;
}
三、求幂
/******二分求幂******/
int pow4(int a,int b)
{
int r=1,base=a;
while(b!=0)
{
// printf("b:%d\n",b);
if(b&1)
{
// printf("b:%d\n",b);
r*=base;
// printf("r:%d\n",r);
}
base*=base;
// printf("base:%d\n",base);
b>>=1;
// printf("b:%d\n",b);
}
return r;
}
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)
printf("%d\n",pow4(a,b));
return 0;
}
/*****快速求幂******/
int pow3(int x,int n)
{
if(n==0)
return 1;
else
{
while((n&1)==0)
{
n>>=1;
// printf("n:%d\n",n);
x*=x;
// printf("x:%d\n",x);
}
}
// printf("***\n");
int result=x;
// printf("result:%d\n",result);
// printf("***\n");
n>>=1;
// printf("n:%d\n",n);
while(n!=0)
{
x*=x;
// printf("x:%d\n",x);
if((n&1)!=0)
{
result*=x;
// printf("result:%d\n",result);
}
n>>=1;
// printf("n:%d\n",n);
}
return result;
}
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)
printf("%d\n",pow3(a,b));
return 0;
}
/***内容来自小白书和百度百科快速幂***/