问题描述:
求A^k mod B
输入:
包括三个正整数A,B,k ,其中1<=A<B<=10,000 ,1<=k<=2,000,000,000
输出:
一个整数表示A^k mod B的值
样例输入
2 3 1
2 3 2
样例输出
2
1
刚开始想到的一定是,用for循环来进行累乘,然后进行计算,但是k的范围过大,使得数据会溢出,所以不能用此方法来解题!
在一本书上看到的一种方法:
我们可以从k的二进制进行思考,
这是求二进制数的方法,所以A^k=(A^k/2)^2;这次应该就有思路了吧
而二进制数只能是0或1,所以如果我们用二进制数来计算表示k的话,可以发现A^k <=> A*k;
#include<stdio.h> int mod(int a,int k,int b) { int temp,ans; ans=1; temp=a; while(k!=0) { if(k%2==1) ans=ans*temp%b; //判断每一次的余数是否是1,如果是1,则把我们前面算出来的temp值乘进去 temp=temp*temp%b; //每一次更新temp的值,其实也是对每一次temp的值取余,间接的减小了temp的值 k/=2; } //计算而k的进制数 return ans; } int main() { int a,b,k; while(scanf("%d%d%d",&a,&b,&k)!=EOF) { printf("%d\n",mod(a,k,b)); } return 0; }希望对大家有帮助
