题目大意:有三个整数a,b,m,求a的b次方%m
1<=a<=1e9;1<=b<=10^20000000;1<=m<=1e8
思路:根据扩展欧拉定理有
其中phi(m)表示欧拉函数即小于等于m的正整数中与互质的数的个数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a, m;
ll bm, flag = 0;
ll qpow(ll a, ll b)
{//快速幂
ll ret = 1;
while (b > 0)
{
if (b & 1)
{
ret = ret * a % m;
}
b >>= 1;
a = a * a % m;
}
return ret;
}
int main()
{
scanf("%lld%lld", &a, &m);
a %= m;
ll mm = m, phi = 1;
for (int i = 2; i * i <= mm; i++)
{//求欧拉函数
if (mm % i)
continue;
phi *= i - 1;
mm /= i;
while (mm % i == 0)
{
phi *= i;
mm /= i;
}
}
if (mm > 1)
{
phi *= mm - 1;
}
char ch;
while (!isdigit(ch = getchar()));
for (; isdigit(ch); ch = getchar())//读入大数,同时取模
{
bm = bm * 10 + ch - '0';
if (bm >= phi)
{
flag = 1;
bm %= phi;
}
}
if (flag)
{
bm += phi;//扩展欧几里得
}
printf("%lld", qpow(a, bm));
return 0;
}