为了求a^bmodm的余数,我们可以利用扩展欧拉定理给出的同余方程,转化成一个好求的式子,首先我们要能够解出欧拉函数.欧拉函数讲解可以看看这篇欧拉函数最全总结-CSDN博客(原理我不懂,只会用)
下面给出代码
using i64 = long long;
int phi(int n) {
int res = n;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
while (n % i == 0) n /= i;
res = res / i * (i - 1);
}
}
if (n > 1) res = res / n * (n - 1);
return res;
}
由于b是一个很大的数,我们需要判断b是否大于mod,并处理
inline int read(int mod)//改进快读,让他边读边输入
{
//g用来判断b与phi(m)的大小.
int x = 0;
bool g = false;
char c = getchar();
while (c < '0' || c>'9') c = getchar();
while (c >= '0' && c <= '9')
{
//等价于x*8+x*2+c-'0'=x*10+c-'0'
x = (x << 3) + (x << 1) + (c ^ '0');
if (x >= mod) x %= mod, g = true;
c = getchar();
}
if (g) return (x + mod);
else return x;
}
此外计算乘方我们还需要一个函数快速幂,p是模数
这是快速幂的讲解:快速幂和矩阵快速幂-CSDN博客
int a, mod;
char b[20000005];
int power(int a, i64 b, int p) {
int res = 1;
for (; b; b /= 2, a = 1LL * a * a % p) {
if (b % 2) {
res = 1LL * res * a % p;
}
}
return res;
}
最后,计算即可
int p;
int main()
{
//读取a和mod
scanf("%d%d", &a, &mod);
//求解欧拉函数
i64 p = phi(mod);
//读取并处理b
i64 cishu = read(p);
//计算
i64 s = power(a, cishu,mod);
//打印
printf("%d\n", s);
return 0;
}