欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

(取余运算)快速幂

程序员文章站 2024-01-14 14:26:22
...

(取余运算)快速幂

描述

输入b,p,k的值,求b^p mod k的值。其中b,p,k×k为长整型数。

格式

输入格式

输入b,p,k的值。

输出格式

求b^p mod k的值。

样例

输入样例

2 10 9

输出样例

2^10 mod 9=7

限制

时间限制: 1000 ms
内存限制: 65536 KB

因为已经习惯用具体题目来讲知识,所以本次也不例外,但确实不是一个好的例子来讲快速幂,但这道题我一直都是90分,没有AC,所以拿来讲解或许也有一种特殊的意义

代码如下:

#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <stack>
#include <algorithm>
typedef long long LL;
using namespace std;

LL QuickMi(LL b,LL p,LL k)
{
    LL answer=1;
    while(p>0)
    {

            if(p%2==1)
            {
                answer=(answer*b)%k;
            }
            p/=2;
            b=b*b%k;
    }
    return (answer%k);
}
int main()
{
    LL b,p,k;
    scanf("%lld %lld %lld",&b,&p,&k);
    if(k==0)
    {
        LL answer=0;
        printf("%lld^%lld mod %lld=%lld",b,p,k,answer);
        return 0;
    }
    LL answer=QuickMi(b,p,k);
    printf("%lld^%lld mod %lld=%lld",b,p,k,answer);
    return 0;
}

快速幂的关键代码:

LL answer=1;
    while(p>0)
    {

            if(p%2==1)
            {
                answer=(answer*b);
            }
            p/=2;
            b=b*b;
    }

快速幂的原理如下:

任何数都可以写成一下形式:

5=2^2 +2^0
15=2^3 +2^2 +2^1 +2^0
29=2^4 +2^3 +2^2 +2^0

没错就是写成2进制,那么写成这样跟我们快速幂有什么关系。

因为我们质数n可以写成n=2^i +2^j+…+ 2^k

  • 所以x^n=x ^2 ^i * x^2 ^j * x^2 ^k

所以这也是b*=b;这里就是将每个x^i等乘起来。

相关标签: 算法 c++