(取余运算)快速幂
描述
输入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=2i+2j+.....+2^k
所以x^n=x ^2 ^i x^2 ^j....* x^2 ^k
所以这也是b*=b;这里就是将每个x^i等乘起来。