Description
Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,B,C<2^63).
Input
There are multiply testcases. Each testcase, there is one line contains three integers A, B and C, separated by a single space.
Output
For each testcase, output an integer, denotes the result of A^B mod C.
Sample Input
3 2 4 2 10 1000
Sample Output
1 24
还有就是两个大数相乘,为了防止数据溢出,需要把其中一个数用二进制表示,这样两个数的积就变成了多项式求和。
代码:
#include <iostream>
typedef unsigned __int64 mm;
using namespace std;
#include <stdio.h>
mm hehe(mm a,mm b,mm m)
{
mm sum=0,tmp=a%m;//防止数据溢出
while(b)
{
if(b&1)
{
if((sum+=tmp)>=m)
sum-=m;
}
if((tmp<<=1)>=m)
tmp-=m;
b>>=1;
}
return sum%m;
}
mm qm(mm m,mm n,mm p)
{
mm b=1;
while(n>1)
{
if(n%2==0)
{
m=hehe(m,m,p);
n=n/2;
}
else
{
b=hehe(b,m,p);
n--;
}
}
return hehe(m,b,p);
}
int main()
{
mm m,n,p;
while(~scanf("%I64u%I64u%I64u",&m,&n,&p))
{
printf("%I64u\n",qm(m,n,p));
}
return 0;
}