1. 欧拉定理
当a与m互质时:
特别的:当m是质数时,所以,欧拉定理变为
2. 拓展欧拉定理
题目:
给你三个正整数,a,m,b,你需要求:a^b mod m(对于 100% 的数据,1≤a≤10^9,1≤b≤10^20000000,1≤m≤10^8)
因为b的数值太大,所以用拓展欧拉定理,拓展欧拉定理的第二种情况正好给b降幂
代码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string s;
typedef long long ll;
ll a, m;
ll get_phi(ll m)//欧拉函数
{
ll res = m;
for (ll i = 2; i * i <= m; i++)
{
if (m % i == 0)
{
res = res / i * (i - 1);
while (m % i == 0)
m /= i;
}
}
if (m > 1)
res = res / m * (m - 1);
return res;
}
ll qpow(ll a, ll b, ll mod)//快速幂
{
ll res = 1;
while (b)
{
if (b & 1)
res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
ll depow(int m)//降幂
{
ll b = 0;
bool j = false;//j用来判断b是否大于m
for (ll i = 1; s[i]; i++)
{
b = (b * 10 + s[i] - '0');
if (b >= m)
{
j = true;
b %= m;
}
}
if(j)//这里决定了是拓展欧拉定理的第一种还是第二种情况
b += m;
return b;
}
int main()
{
scanf_s("%lld%lld", &a, &m);
getline(cin, s);
ll ds = depow(get_phi(m));
ll ans = qpow(a, ds, m);
printf("%lld\n", ans);
}