zoukankan      html  css  js  c++  java
  • 高次幂求模

    主要的思想是来自一个公式:a*b%c = (a%c) *(b%c) %c

    基本概念及思想

    对形如a^b mod m 的运算(b一般较大)
    但a,b,m都在long型范围内
    算法的主要思想是分治,分而治之。将大的问题分成若干个相似的较小的问题!
    具体实现是用递归的方法!
     
    举例
    2^100mod 3
    像这种运算如果先算出2^100 的值,然后再模上3,相信比较困难!
    我们可以将100变小点
    2^100=(2^50)^2 =((2^25)^2)^2=((((2^1)^2)^2)…)^2
    若我们已经得出250 mod 3的值,我们便很简单地得出2^100mod 3的值。
    按照上述的方法继续分下去…
    最终肯定会得到2^1mod 3 这种情况!这样就好办了!这便是递归的边界,到此我们就可以返回2 mod 3的值了!
    另一个问题,再分时有两种情况!
    2^100=(2^50)2        , 100是偶数
    2^99=(2^49)2 *2   , 99是奇数
    第二种情况需要在第一种情况上乘上一次基数。

    递归算法代码如下

     1 long mod(long a,long b,long c)
     2 {
     3     long ans;
     4     if(!b)return 1;
     5     else if(b==1)return a%c;
     6     else ans = mod(a,b/2,c);
     7     ans = (ans*ans)%c;
     8     if(b&1)ans = (ans*(a%c))%c;
     9     return ans;
    10 }

    另一种高效的算法是用循环代替递归算法

     1 long mod_loop(long a,long b,long c)
     2 {
     3     long ret=1,tem=a;
     4     while(b)
     5     {
     6         if(b&1) ret = ret*tem%c;
     7         tem = tem*tem%c;
     8         b>>=1;
     9     }
    10     return ret;
    11 }

     

  • 相关阅读:
    文件的上传和下载
    UIMenuController
    iOS中JavaScript和OC交互
    显示图片的各种方式
    图文混排
    介绍一下Cocao 和Cocoa Touch
    iOS 利用UIWebView与JavaScript交互的最简单办法(本人已验证可行)
    UIAlertView和UIAlertControl
    iOS的一些常用性能优化,和内存优化的方法
    关于ARC和MRC
  • 原文地址:https://www.cnblogs.com/newpanderking/p/2468656.html
Copyright © 2011-2022 走看看