描述
给定整数a,b,n,要求计算(a^b)mod n
输入
多组数据,每组数据一行,为三个用空格隔开的整数a,b,n
1<=a<=5000,0<=b<=10^8,1<=n<=5000000
输出
每组数据输出一行,为所求值
样例输入
2 3 5
2 2 4
样例输出
3
0
链接:http://202.119.236.66/acmhome/problemdetail.do?&method=showdetail&id=1037
这道题目应该用快速幂的方法来做,如果直接暴力求解会TLE。
可以将b按二进制位展开,b=f(n)*2^n+f(n-1)*2^(n-1)+f(n-2)*2^(n-2)+...+f(1)*2^1+f(0)*2^0;
则a^b=a^(f(n)*2^n+f(n-1)*2^(n-1)+f(n-2)*2^(n-2)+...+f(1)*2^1+f(0)*2^0)=a^(f(n)*2^n)*a^(f(n-1)*2^(n-1))*a^(f(n-2)*2^(n-2))*...*a^(f(1)*2^1)*a^(f(0)*2^0)
通项公式为a^(f(k)*2^k);这里的f(k)(k=0,1,2,3,...,n)取值为0或1,当f(k)=0时,通项公式的值为1,不需要考虑;当f(k)=1时,通项公式为a^(2^k),所以我们只要求出a^(2^k)的值就可以了;
实现代码如下(这里我们用的是迭代的方法):
#include<stdio.h>
int main()
{
int a,b,n;
long long ans,temp;
while(~scanf("%d%d%d",&a,&b,&n))
{
ans = 1;temp = a;
while(b)
{
if(b%2) ans=(ans%n)*temp;
b /= 2;
temp=temp%n;
temp=(temp*temp)%n;
}
printf("%I64d\n",ans%n);
}
return 0;
}