2024江苏省大学生程序设计大赛(JSCPC)热身赛题解(B)

题目大意:

求区间\([l, r]\)中有多少正整数满足\(\phi(\phi(n)) = \phi(n) - 1\),其中\(\phi\)为欧拉函数。

解:

\(y=\phi(n)\),则上式变为\(\phi(y) = y - 1\),易证\(y\)为质数(注意\(\phi(1) = 1\)\(1\)与任何正整数都互质)。

故原问题转化为求\([l, r]\)中有多少个正整数v满足\(\phi(v)\)为质数。

首先\(1\)的欧拉函数是\(1\),不是质数。

考虑欧拉函数的公式\(\phi(n) = n(1-\frac{1}{p_1})(1-\frac{1}{p_2})\cdot...\cdot(1-\frac{1}{p_k})=\frac{n}{p_1p_2\cdot...\cdot p_k}(p_1-1)(p_2-1)\cdot...\cdot(p_k-1)\),其中\(p_1, p_2, \dots, p_k\)\(n\)的所有质因数。

注意到上式中\(\frac{n}{p_1p_2\cdot...\cdot p_k}\)必定为一个正整数

观察质数\(2, 3, 5, 7, 9, 11, 13, ...\)

  1. \(n\)的质因数中包含\(\ge5\)的数时,设该数为\(m\),则\(m - 1\)一定是一个合数(因为这个范围内的质数一定都是奇数,且每两个质数之差\(\ge2\)),故\(n\)的欧拉函数不是质数。

  2. \(n\)的质因数只有\(2\)\(3\),设\(n = 2^a 3^b\)

    • \(b>1\),则\(\frac{n}{p_1p_2\cdot...\cdot p_k}\)一定是3的倍数,且\((3 - 1) = 2\)同时又是右边的因子,故\(n\)的欧拉函数一定是合数,不是质数(\(n\)\(2\times 3\)的倍数)。
    • \(b=0\),则\(\phi(n)=\frac{n}{2}\),只有当\(a=2\)\(n\)的欧拉函数是质数。
    • \(b=1\)
      • \(a>1\),则\(\frac{n}{p_1p_2\cdot...\cdot p_k}\)一定是2的倍数,且\((3 - 1) = 2\)同时又是右边的因子,故\(n\)的欧拉函数一定是合数,不是质数。

接下来讨论\(a=0\)\(a=1\),最后总结得出欧拉函数为质数的正整数只有\(3, 4, 6\)

int l, r;

// 返回0~x中欧拉函数是质数的数的个数
int ans(int x) {
	if (x >= 6) return 3;
	if (x >= 4) return 2;
	if (x >= 3) return 1;
	return 0;
}

void solve() {
	cout << ans(r) - ans(l - 1) << '\n';
}
posted @ 2024-05-11 22:30  lightmon  阅读(124)  评论(1编辑  收藏  举报