zoukankan      html  css  js  c++  java
  • 49.分治算法练习:  1497 取余运算


     时间限制: 1 s

     空间限制: 128000 KB

     题目等级 : 钻石 Diamond

    题解

     查看运行结果

    题目描述 Description

    输入bpk的值,编程计算bp mod k的值。其中的bpk*k为长整型数(2^31范围内)。

    输入描述 Input Description

    b p k 

    输出描述 Output Description

    输出b^p mod k=?

    =左右没有空格

    样例输入 Sample Input

     10  9

    样例输出 Sample Output

    2^10 mod 9=7

    数据范围及提示 Data Size & Hint

    分类标签 Tags 点此展开 

    分治 快速幂 数论

    w        分析:本题主要的难点在于数据规模很大(bp都是长整型数),对于b^p显然不能死算,那样的话时间复杂度和编程复杂度都很大。

    w               下面先介绍一个原理:A*B%K = (A%K )*(B% K )%K。显然有了这个原理,就可以把较大的幂分解成较小的,因而免去高精度计算等复杂过程。那么怎样分解最有效呢?

    显然对于任何一个自然数P,有P= P/2* 2  + P%2,如19=2 * 19/2 + 19%2=2*9+1,利用上述原理就可以把B19次方除以K的余数转换为求B9次方除以K的余数,即B19=B2*9+1=B*B9*B9,再进一步分解下去就不难求得整个问题的解

    代码:

    #include

    using namespace std;

    #include

    long long f(long long );

    long long b,k;

    int main()

    {

           long long p;

           cin>>b>>p>>k;

           cout<<b<<"^"<<p<<" mod "<<k<<"=";//输出的格式

           b%=k;//不能放在前面,那么b的只就不对了

           b=f(p);

           cout<<b;

           return 0;

    }

    long long f(long long p)

    {

           if(p==0) return 1;//b^0%k==1,这是递归的边界

           long long tmp=f(p/2)%k;

           tmp=tmp*tmp%k;

           if(p%2==1) tmp=(tmp*b)%k;//因为在main已经有了b%=k了,所以这里乘以b不用再%k

           return tmp;//tmp储存的是当前的b^p%k的值,传回上一层函数再平方

          

    }

    //2^10 mod 9=7

  • 相关阅读:
    浅谈P2P、P2C 、O2O 、B2C、B2B、 C2C的区别
    用CornerStone配置SVN,HTTP及svn简单使用说明
    Nginx之让用户通过用户名密码认证访问web站点
    linux下php redis扩展安装
    mac下用户用户组命令行操作
    linux下MySQL安装及设置(二)
    linux下MySQL安装及设置
    linux下php的一些问题
    计算多个文档之间的文本相似程度
    提取图像兴趣点
  • 原文地址:https://www.cnblogs.com/csgc0131123/p/5290400.html
Copyright © 2011-2022 走看看