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;
}
原文地址:https://www.cnblogs.com/Kyriech-Francis/p/Answer_P1226.html