题目描述:
给出3个正整数A B C,求A^B Mod C。
例如,3 5 8,3^5 Mod 8 = 3。
Input
3个正整数A B C,中间用空格分隔。(1 <= A,B,C <= 10^9)
Output
输出计算结果
Sample Input
3 5 8
Sample Output
3
一开始,我仅仅简单的写了些代码,但是发现运算时间超长了,错误代码如下:
#include <stdio.h>
int main()
{
int A,B,C,i;
long long s=1;
scanf("%d %d %d",&A,&B,&C);
for(i=1;i<=B;i++){
s*=A;
if(s>C) s%=C;
}
printf("%lld\n",s%C);
return 0;
}
这里的缩小思路是:那些被取余掉的地方,就算再乘以一个数,它也是b的倍数,所以取余掉也不会对最后的结果有影响。
所以仅仅将数据缩小是不够的,我们还得考虑到运行时间,所以得设计出更高效率的算法。如二分查找。
思路:这里我们得灵活地运用公式(a*b)%c=(a%c)*(b%c)%c
代码:
#include <stdio.h>
int main()
{
long long a,b,c,s=1;
scanf("%lld %lld %lld",&a,&b,&c);
while(b!=1)
{
if(b%2==1)
{
s=s*a;
s=s%c;
}
a=a*a;
a=a%c;
b=b/2;
}
printf("%lld\n",s*a%c);
return 0;
}