(取余运算)快速幂

(取余运算)快速幂

描述

输入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 
#include 
#include 
#include 
#include 
#include 
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++)