幂取模
例题: 幂取模
输入正整数a、n和m ,输出a^n mod m 的值。a,n,m<=10^9.
第一种方法:(很容易想出)
View Code
#include <iostream> using namespace std; int pow_mod(int a,int n,int m) { int ans=1; for(int i=0; i<n; i++) ans=(int)((long long)ans*a % m); return ans; } int main() { int a,n,m; cin>>a>>n>>m; cout<<pow_mod(a,n,m)<<endl; return 0; }
上面写的函数的时间复杂度为O(n) ,当n 很大时速度很不理想。有没有办法算得更快呢?下面用分治法
第二种方法:
View Code
#include <iostream> using namespace std; int pow_mod(int a,int n,int m) { if(n==1) return a%m; int x=pow_mod(a,n/2,m); long long ans=(long long)x*x % m; if(n%2==1) ans=ans*a % m; return (int)ans; } int main() { int a,n,m; cin>>a>>n>>m; cout<<pow_mod(a,n,m)<<endl; return 0; }