題敘
http://domen111.github.io/UVa-Easy-Viewer/?374
給定三個整數 $B$ $P$ $M$ ,求 $B^P mod M$
想法1 - 暴力解
從 $1$ 開始到 $P$ ,每次乘上 $B$ 再模 $M$ ,複雜度 $O(P)$
但是複雜度過高,會TLE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include<bits/stdc++.h> #define ll long long #define pii pair<int,int> using namespace std; ll b,p,m;
int main(){ while(cin>>b>>p>>m){ ll ans=1; for(int i=1 ; i<=p ; i++){ ans = ans*b % m; } cout<<ans<<"\n"; } return 0; }
|
想法2 - 快速冪
觀察我們計算的過程
如果我們要計算 $2^4$ ,我們會直接把 $2$ 乘 $4$ 次
但是實際上發現 $2^4 = (2^2)^2$
所以對於次數是偶數的,可以只計算一次,再來平方即可
而奇數呢?
假如我們要計算的 $3^3$
實際上會等同於 $3 * 3^2$
這樣一來一定能轉換成一次乘上偶數次
複雜度 $O(log_2 P)$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include<bits/stdc++.h> #define ll long long #define pii pair<int,int> using namespace std; ll b,p,m;
ll solve(int x,int y,int mod){ if(y==0) return 1; if(y%2) return (x*solve(x,y-1,mod))%mod; else{ ll half=solve(x,y/2,mod); return (half*half)%mod; } }
int main(){ while(cin>>b>>p>>m){ cout<<solve(b,p,m)<<"\n"; } return 0; }
|