题目
求a^n (mod m).
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll pow_mod(ll a,ll n,ll m)
{
ll ans=1,x=a;
while(n)
{
if(n&1)
{
ans=ans*x%m;
}
n>>=1;
x=x*x%m;
}
return ans;
}
int main()
{
ll a,n,m;
while(cin>>a>>n>>m)
cout<<pow_mod(a,n,m)<<endl;
return 0;
}
原理
将n看作二进制表示形式,如求3^10,10的二进制表示为 1010.即0*2^0+1*2^1+0*2^2+1*2^3.
那么3^10 = 3^8 * 3^2.对二进制表示从右到左枚举,如果该位为1,则累乘x.x为该位所表示的值。
递归版
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll pow_mod(ll a,ll n,ll m)
{
ll ans;
if(n==0) return 1;
ans=pow_mod(a,n/2,m);
ans=ans*ans%m;
if(n&1) ans=ans*a%m;
return ans;
}
int main()
{
ll a,n,m;
while(cin>>a>>n>>m)
cout<<pow_mod(a,n,m)<<endl;
return 0;
}