1. 程式人生 > 其它 >AcWing 89. a^b(位運算/快速冪)

AcWing 89. a^b(位運算/快速冪)

技術標籤:題解AcWingc語言c++

題目連結

求 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; }