题目描述
给你三个整数 b,p,k,求 b^pmod 。
输入格式
输入只有一行三个整数,分别代表 b,p,k
输出格式
输出一行一个字符串 b^p mod k=s
,其中 b, p, k分别为题目给定的值, s 为运算结果。
输入输出样例
输入 #1复制
2 10 9
输出 #1复制
2^10 mod 9=7
说明/提示
样例输入输出 1 解释
2^{10} =1024,1024 mod 9 = 71024mod9=7。
数据规模与约定
- 对于 100\%100% 的数据,保证 0\le b,p < 2^{31}0≤b,p<231,1 \leq k \leq 2^{31}1≤k≤231。
以 3^10 % 9为例
思路一:
(10)10=(1010)2, 1表示取, 幂次为1,2,4,8,16.......,3^1,3^2, 3^4,3^8.....每次将取的数表示出来,依次累乘即可。
3^2=(3^1)^2
3^4=(3^2)^2
3^8=(3^4)^2
.......
所以每次循环都平方构造出取的数。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll fun(ll a, ll b, ll m){
ll base=a%m,c=1%m;//c要取模,防止m=1的情况
while(b){
if(b&1){
c=c*base%m;
}
b>>=1;
base=base*base%m;//base就是每次构造要乘上的数
}
return c;
}
int main(){
ll b,p,k;
cin>>b>>p>>k;
cout<<b<<"^"<<p<<" mod "<<k<<"="<<fun(b,p,k)<<endl;
return 0;
}
思路二:
根据幂次p,可以分为偶数与奇数两种情况。
若p为奇数, b^p=b* ((b^2)^(p/2))
若p为偶数 b^p=(b^2)^(p/2)
其中b是在不断变化的,b*=b;