1、高次幂取模(快速幂取模)(张鹏),基本概念及思想,对形如ab mod m 的运算(b一般较大)但a,b,m都在long型范围内算法的主要思想是分治,分而治之。将大的问题分成若干个相似的较小的问题!具体实现是用递归的方法!,举例,2100 mod 3像这种运算如果先算出2100 的值,然后再模上3,相信比较困难!我们可以将100变小点2100=(250)2 =(225)2)2=(21)2)2)2若我们已经得出250 mod 3的值,我们便很简单地得出2100 mod 3的值。,续上,按照上述的方法继续分下去最终肯定会得到 21 mod 3 这种情况!这样就好办了!这便是递归的边界,到此我们就可以
2、返回2 mod 3的值了!另一个问题,再分时有两种情况!2100=(250)2 , 100是偶数299=(249)2 *2 , 99是奇数第二种情况需要在第一种情况上乘上一次基数。,主要代码,long mod(long a,long b,long m) if(!b) return 1; /边界处理 if(b=1) return a%m; /边界处理 long ans=mod(a,b/2,m); /进入下一层 ans=ans*ans%m; /返回值ans代表ab/2 if(b /返回ans代表abmodm,调用,上述函数是有三个参数,且有返回值!它的功能是计算ab mod m的值!如何在主函数里
3、调用呢?例如我们要计算2100mod3的结果!我们可以首先定义一个变量ans,在主函数读入工作完成后,我们可以写ans=mod(2,100,3);ans 里的数值便是2100mod3的结果了。,递推法,用递推法首先要将b转换为二进制数,(b)10=(b)2。举例: (45)10=(101101)2545 mod 3 =2二进制数由0和1组成,它们分别代表着偶数和奇数。递推时在0和1处的处理是有差别的。,参考代码,二进制转换:long s=0;while(b0) t+s = b%2; b/=2;,续上,递推过程:long ans=1;for(i=1;i=s;i+)if(ti) ans=ans*ans*a%m;else ans=ans*ans%m;,End,Thank you,