标签:style blog color sp 数据 div log 代码 bs
刚刚接触到ACM 遇到指数实在是有心无力,在网上查了一下.发现了快速幂.现总结如下:
我称为quick mi.
假设3个数字 a,b,c;
我要求的是 (a^b)modc=?
显然,如果a b 都过大的话,数据肯定会溢出的. 所以
用quick mi肯定简单许多,时间缩短了,而且也不容易溢出.
首先想到一个公式:(a*b)modc = (amodc)*(bmodc)modc;
这个公式怎么来的,证明过程如下:
amodc=d;
bmodc=e;
a=tc+d;
b=kc+e;
所以 (a*b)modc=(...)(...)modc=(tkc^2+(te+ak)c+de)modc=demodc=(amodc)(bmodc)modc;
依上公式可得:
假设b为偶数 即得 ((a^2)^(b/2))mod c 然后设a=a^2 得 (a^(b/2))modc 又令 a=a^2;得 (m^(b/4))modc;
但是 在此过程中,很有可能会使得b的值为奇数,那么,只要在加一句判断 然后 s=(s*a)%c;s为之前求得的余数。//即多乘一项即可!
代码如下:
1 int quickmi(int a,int b,int c) 2 { int s=1; 3 a=a%c; 4 while(b>0) 5 { 6 if(b%2==1)//判断一下b是否为奇数 7 s=(s*a)%c;//如果是奇数,则多乘一项 8 b=b/2; 9 a=(a*a)%c; 10 } 11 return s; 12 }
标签:style blog color sp 数据 div log 代码 bs
原文地址:http://www.cnblogs.com/ikids/p/4072042.html