AcWing 89. a^b(位運算/快速冪)
阿新 • • 發佈:2021-02-07
求 a 的 b 次方對 p 取模的值。
輸入格式
三個整數 a,b,p ,在同一行用空格隔開。
輸出格式
輸出一個整數,表示a^b mod p的值。
資料範圍
0≤a,b≤109
1≤p≤109
輸入樣例:
3 2 7
輸出樣例:
2
思路(其他博主總結):
1.ll ans = 1 % p;
2.做題必看資料範圍邊界條件,是否有0,1等特殊值;
原理:1.(a*b) % c == (a%c) * (b%c) % c
2.將指數b拆為 b = bit(0)*2(0) + bit(1)*2(1) + bit(2)*2(2)······ bit(k)表示二進位制拆分後k位上的值,為0或1
3.a的b次方可以表示為 a^(bit(0)*2(0)) * a^(bit(1)*2(1)) * a^(bit(2)*2(2))······
4.如果第i位的 bit(i) == 0 則 a^(bit(i)*2(i)) == 1 可以不考慮,如果第i位的 bit(i) == 1 則 需要進行計算,每進一次迴圈 a 將變為 a * a
答案:
#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f3f3f3f3f
#define rep(i,a,b) for(auto i=a;i<=b;++i)
#define bep(i,a,b) for(auto i=a;i>=b;--i)
#define lowbit(x) x&(-x)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define PI acos(-1)
#define pb push_back
#define eps 1e-6
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
const int M = 111;
using namespace std;
ll n,m,p;
ll quick_mod(ll x,ll y, ll p){
ll ans=1%p;
x%=p;
while(y){
if(y&1) ans=ans*x%p;
x=x*x%p;
y>>=1;
}
return ans;
}
void solve(){
cin>>n>>m>>p;
cout<<quick_mod(n,m,p)<<endl;
}
int main() {
solve();
return 0;
}