洛谷P1226【模板】快速幂||取余运算
题目描述
输入b,p,k的值,求b^p mod k的值。其中b,p,k*k为长整型数。
输入输出格式
输入格式:
三个整数b,p,k.
输出格式:
输出“b^p mod k=s”
s为运算结果
输入输出样例
2 10 9
//输出
//2^10 mod 9=7
解题思路
- 利用模运算的性质, a ∗ b % k = ( ( a % k ) ∗ ( b % k ) ) % k a*b\% k=((a\%k) *(b\%k) )\% k a∗b%k=((a%k)∗(b%k))%k
- 分 p p p的奇偶性讨论,如2^7%k=2^3 *2%k,2^3%k=2^2*2%k,…
- 注意 p & 2 p\&2 p&2相当于 p % 2 = = 1 p\%2==1 p%2==1; p > > = 1 p>>=1 p>>=1相当于 p / = 2 p/=2 p/=2
#include <iostream>
#include<vector>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
//快速幂
ll b,p,k,ans=1;
int main(int argc, char** argv) {
cin>>b>>p>>k;
printf("%lld^%lld mod %lld=",b,p,k);
if(p==0){
printf("%lld\n",1%k);
return 0;
}
while(p>=1){
if(p&1){
ans=(ans%k)*(b%k)%k ;
}//奇数 {
// b*=b%k;
b=(b*b)%k;
p>>=1;//p/2
}
printf("%lld\n",ans);
return 0;
}