2023年蓝桥杯第十四届省赛真题-互质数的个数 知识点:欧拉函数 快速幂

67 阅读1分钟

1.互质数的个数 - 蓝桥云课 (lanqiao.cn)

求1到aba^{b}的互质数的个数

互质的意思是两个数的公因数只有1

那么就要先把aba^{b}求出来,因为a是10610^{6},b是10910^{9},都非常大,所以需要快速幂求解

然后再来说求解互质数的个数,要用到欧拉函数。

我们这里不能先求aba^{b}的快速幂再代入欧拉函数求解,结果会不一样。

image.png

因此我们可以先求a的互质数的个数,再来用快速幂求b次方。

我们可以从aba^{b}里把a提取出来,变为aab1a*a^{b-1}

#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;
}