快速幂取模
快速幂算法依赖于以下的公式:
也就是说b个a,第一次拿出来两个,第二次拿出第一次的二倍。。。就是2 4 8 16这样复杂度就变成了logb。
#include<cstdio>
using namespace std;
int ans;
int power1(int a,int b,int c)//普通方法//
{
ans=1;
//同余定理 ab(a的b次方) mod c = (a mod c)b(b次方) mod c//
for(int i = 1 ; i <=b ; i++)
{
ans=(ans*a)%c;
}
return ans;
}
int power2(int a,int b,int c)
{
ans = 1;
a=a%c;
while(b)
{
if(b&1)//如果b是奇数//
ans=(ans*a)%c;
a=(a*a)%c;
b >>= 1;//b=b/2//
}
return ans;
}
int main()
{
int a,b,c;
while(~scanf("%d%d%d",&a,&b,&c))
{
printf("%d",power1(a,b,c));
printf("%d",power2(a,b,c));
}
return 0;
}
一个练习:http://acm.hpu.edu.cn/vjudge/contest/view.action?cid=10#problem/J