zoukankan      html  css  js  c++  java
  • P1226 【模板】快速幂||取余运算

    P1226 【模板】快速幂||取余运算

    通过一个模板题简单总结一下快速幂

    题目描述

    给你三个整数 b,p,k,求b的p次方mod k的值

    输入格式

    输入只有一行三个整数,分别代表 b,p,k

    输出格式

    输出一行一个字符串 b^p mod k=s,其中 b, p, kb,p,k 分别为题目给定的值, ss 为运算结果。

    输入输出样例

    输入 #1复制

    2 10 9
    

    输出 #1复制

    2^10 mod 9=7
    

    【算法思路】

    对于一个数的n次幂,我们可以将它进行拆解,在这里以2^15为例:

    step1.答案等于 15 个 2 相乘.
    step2.答案等于 7 个 4 相乘再乘上一个 2.
    step3.答案等于 3 个 16 相乘再乘上 2*4.
    step4.答案等于 1 个 256 乘上 2*4*16.
    

    从以上的步骤中不难看出,当我们求一个数的n次幂的时候,我们可以将它的两两进行配对相乘,如果有多出来的一个数,则将它乘到答案中,否则继续配对,直到只剩下一个数为止。有一个小的注意事项,对答案进行初始化时,初始值应为1而不是0.

    【注意事项】

    1、每进行一步运算时都要把得到的答案对p取模,否则会只有28分。

    2、b m p ans 都要定义成 long long 型变量,不然会只有42分。

    3、不要认为运算过程中对答案取模就够了,再输出答案的时候不要忘记把最终的答案再对p取一次模,否则就会只有84分。

    4、结合以上几点注意事项的快速幂程序就可以得到100分了。

    【代码】

    #include <bits/stdc++.h>
    using namespace std;
    
    int main(){
        long long ans=1,i,j,k,m,n,b,p;
        scanf("%lld%lld%lld",&b,&m,&p);
        printf("%lld^%lld mod %lld=",b,m,p);
        while(m>0){
            if(m%2==1)
                ans=ans*b%p;
            b=b*b%p;
            m=m>>1;
        }
        printf("%lld",ans%p);
        return 0;
    }
    
  • 相关阅读:
    Maven 集成Tomcat插件
    dubbo 序列化 问题 属性值 丢失 ArrayList 解决
    docker 中安装 FastDFS 总结
    docker 从容器中拷文件到宿主机器中
    db2 相关命令
    Webphere WAS 启动
    CKEDITOR 4.6.X 版本 插件 弹出对话框 Dialog中 表格 Table 自定义样式Style 问题
    SpringMVC JSONP JSON支持
    CKEDITOR 3.4.2中 按钮事件中 动态改变图标和title 获取按钮
    git回退到远程某个版本
  • 原文地址:https://www.cnblogs.com/Kyriech-Francis/p/Answer_P1226.html
Copyright © 2011-2022 走看看