1.互质数的个数 - 蓝桥云课 (lanqiao.cn)
求1到的互质数的个数
互质的意思是两个数的公因数只有1
那么就要先把求出来,因为a是,b是,都非常大,所以需要快速幂求解
然后再来说求解互质数的个数,要用到欧拉函数。
我们这里不能先求的快速幂再代入欧拉函数求解,结果会不一样。
因此我们可以先求a的互质数的个数,再来用快速幂求b次方。
我们可以从里把a提取出来,变为
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define MOD 998244353
int qmi(int a, int b) {
int res = 1;
while (b) {
if (b & 1)
res = res * a % MOD; //如果b是1,就算一下结果
a = a * a % MOD; //底数倍增
b >>= 1; //指数右移
}
return res;
}
int divide(int res, int n) {
for (int i = 2; i * i <= n; i++) {
//把i除尽
if (n % i == 0)
{ //能被除尽一定是素数
res = res / i * (i - 1)%MOD; //欧拉函数的板子
}
while (n % i == 0)
{ //i能被除尽i一定是素数
n /= i;
}
}
if (n > 1)
res = res / n * (n - 1) % MOD; //最后那个大于根号n的因子
return res;
}
signed main() {
int a, b;
cin >> a >> b;
//特判
if (a == 1) { //a为1的时候没有区间
cout << 0;
return 0;
}
//欧兰函数求解
int res = divide(a, a);
//快速幂
cout << res *qmi(a, b - 1) % MOD << endl;
return 0;
}