求 a 的 b 次方对 p
取模的值。
输入格式
三个整数 a,b,p
,在同一行用空格隔开。
输出格式
输出一个整数,表示a^b mod p
的值。
数据范围
1≤a,b,p≤10e9
输入样例:
3 2 7
输出样例:
2
#include<iostream>
using namespace std;
#include<string>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define minx 1e18;
#define maxx 0;
typedef long long ll;
ll fpow(ll a,ll b,ll k)
{
ll ans=1%k;
ll base=a%k;
while(b)
{
if(b&1)
{
ans=(ans*base)%k;
}
base=(base*base)%k;
b>>=1;
}
return ans;
}
int main()
{
ll a,b,k;
cin>>a>>b>>k;
cout<<fpow(a,b,k)<<endl;
return 0;
}
关于a^b,举一个实际的例子——2^10。
那么对于6而言,如果我们将10变成二进制,那么就是:1010,如果变成加权的情况可以得到表达式:
0*2^0 + 1*2^1 + 0*2^2 + 1*2^3
代入原来的2^10可以得到表达式:
2^(0*2^0 + 1*2^1 + 0*2^2 + 1*2^3)
然后再拆开并化简这个表达式,可以得到:
2^(2^1) * 2^(2^3)
也就是说,我们在求解2^10的时候,可以考虑成根据二进制的权值来求解的。那么在关于位运算的部分,我们可以逐位获取b的位,碰到0,就累乘,碰到1,就将累乘的值乘到答案。
原文:https://blog.csdn.net/iwts_24/article/details/79780596