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