#include<stdio.h>
unsigned long long mul(unsigned long long a,unsigned long long b,unsigned long long c)
{
unsigned long long ret=0,tmp=a%c;
while(b)
{
if(b&0x1)
if((ret+=tmp)>=c)
ret-=c;
if((tmp<<=1)>=c)
tmp-=c;
b>>=1;
}
return ret;
}
unsigned long long mod(unsigned long long a,unsigned long long b,unsigned long long c)
{
unsigned long long y=1;
while(b)
{
if(b&1)
y=mul(y,a,c);
a=mul(a,a,c);
b=b>>1;
}
return y;
}
int main()
{
unsigned long long a,b,c;
while(scanf("%llu%llu%llu",&a,&b,&c)!=EOF)
printf("%llu/n",mod(a,b,c));
return 0;
}
思路:例如2^10 -> 4^5 -> 4*16^2 上面的y就是记录这个本来会少乘的4,边求边mod;
数较大的话会溢出,在编写一个相乘的算法,防止溢出。