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

  • 相关阅读:
    ZOJ 3705 Applications
    UVA 220 Othello
    HDU 2084 数塔
    第五章:变量
    第四章:注释
    第三章:程序结构
    第二章:项目的创建和环境熟悉
    第一章:c#开发环境安装
    处理字段串
    查询表的列信息
  • 原文地址:https://www.cnblogs.com/c1299401227/p/5370774.html
Copyright © 2011-2022 走看看