快速幂(化幂为乘):快速计算 a * b % mod 的结果。(时间复杂度log n, 且可以在过程中取模)
快速乘(化乘为加) : log n
求a的b次方,取模mod(1<=a,b,mod<=1e18)
Input
多组输入,每组数据一行,3个正整数,分别为a,b,mod
Output
每组数据输出一行,为答案
Sample Input
2 10 10000000 5 100 1 0 2 37Sample Output
1024 0 0Hint
无
这个题因为过程量较大, 会爆 longlong 所以要用快速乘 处理过程量。
快速乘模板:
对于 :a*53 = a*110101(二进制) 若 a = 5;
ll mul(ll a, ll b, ll mod)
{
ll ans = 0;
while(b)
{
if(b & 1)
ans = (ans + a) % mod;
b >>= 1;
a = (a * 2) % mod;
}
return ans;
}
快速幂
快速幂代码只有两点不同:
1 : ll ans = 1; (因为是化幂为乘)
2 : a = ( a * a ) % mod;
ll ex(ll a, ll b, ll mod)
{
ll ans = 1;
while(b)
{
if(b & 1)
ans = ans * a % mod; // 若数值过大。
ans = mul(ans, a, mod);
b >>= 1;
a = a * a % mod;
a = mul(a, a, mod);
}
return ans;
}
ac代码:
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
typedef long long ll;
const int N = 110;
const int MOD = 1e9 + 7;
int t = 0;
int n = 0;
ll mul(ll a, ll b, ll mod)
{
ll ans = 0;
while(b)
{
if(b & 1)
ans = (ans + a) % mod;
b >>= 1;
a = (a * 2) % mod;
}
return ans;
}
ll ex(ll a, ll b, ll mod)
{
ll ans = 1;
while(b)
{
if(b & 1)
//ans = ans * a % mod;
ans = mul(ans, a, mod);
b >>= 1;
//a = a * a % mod;
a = mul(a, a, mod);
}
return ans;
}
int main()
{
cin.tie(0);
std::ios::sync_with_stdio(false);
ll a, b, mod;
while(~scanf("%lld%lld%lld", &a, &b, &mod))
{
cout << ex(a, b ,mod) << endl;
}
}