Problem 1752 A^B mod C
Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,B,C<2^63).
There are multiply testcases. Each testcase, there is one line contains three integers A, B and C, separated by a single space.
For each testcase, output an integer, denotes the result of A^B mod C.
3 2 4
2 10 1000
1
24
解法:快速乘法:15x5=75=15+60;换成二进制就是代表 1111+111100=75;跟快速幂一样在乘数右移一位,被乘数左移一位,当乘数与1为真时 值加1;
#include
#include
#include
#include
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
ll mulit(ll a,ll b,ll c)//快速乘
{
ll ans=0;
a%=c;
while(b)
{
if(b&1)
{
ans+=a;
if(ans>c){ans-=c;}//大于减c
}
a<<=1;
if(a>=c)a-=c;
b>>=1;
}
return ans;
}
ll quick(ll a,ll b,ll c)//求阶乘
{
ll ans=1;
while(b)
{
if(b&1){ans=mulit(ans,a,c);}
a=mulit(a,a,c);
b>>=1;
}
return ans;
}
int main()
{
ll a,b,c;
while(~scanf("%I64d%I64d%I64d",&a,&b,&c))
{
printf("%I64d\n",quick(a,b,c));
}
return 0;
}