跳过正文

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

·105 字· loading · loading · · ·
lightmon
作者
lightmon
该博主太懒了,尚未添加简介。
目录

题目大意:
#

求区间\([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';
}
Footer Background

© 2026 lightmon

Hugo & Blowfish 强力驱动