题目大意:
求区间[l,r][l, r][l,r]中有多少正整数满足ϕ(ϕ(n))=ϕ(n)−1\phi(\phi(n)) = \phi(n) - 1ϕ(ϕ(n))=ϕ(n)−1,其中ϕ\phiϕ为欧拉函数。
解:
设y=ϕ(n)y=\phi(n)y=ϕ(n),则上式变为ϕ(y)=y−1\phi(y) = y - 1ϕ(y)=y−1,易证yyy为质数(注意ϕ(1)=1\phi(1) = 1ϕ(1)=1,111与任何正整数都互质)。
故原问题转化为求[l,r][l, r][l,r]中有多少个正整数v满足ϕ(v)\phi(v)ϕ(v)为质数。
首先111的欧拉函数是111,不是质数。
考虑欧拉函数的公式ϕ(n)=n(1−1p1)(1−1p2)⋅...⋅(1−1pk)=np1p2⋅...⋅pk(p1−1)(p2−1)⋅...⋅(pk−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)ϕ(n)=n(1−p11)(1−p21)⋅...⋅(1−pk1)=p1p2⋅...⋅pkn(p1−1)(p2−1)⋅...⋅(pk−1),其中p1,p2,…,pkp_1, p_2, \dots, p_kp1,p2,…,pk为nnn的所有质因数。
注意到上式中np1p2⋅...⋅pk\frac{n}{p_1p_2\cdot...\cdot p_k}p1p2⋅...⋅pkn必定为一个正整数
观察质数2,3,5,7,9,11,13,...2, 3, 5, 7, 9, 11, 13, ...2,3,5,7,9,11,13,...
-
若nnn的质因数中包含≥5\ge5≥5的数时,设该数为mmm,则m−1m - 1m−1一定是一个合数(因为这个范围内的质数一定都是奇数,且每两个质数之差≥2\ge2≥2),故nnn的欧拉函数不是质数。
-
若nnn的质因数只有222或333,设n=2a3bn = 2^a 3^bn=2a3b,
- 若b>1b>1b>1,则np1p2⋅...⋅pk\frac{n}{p_1p_2\cdot...\cdot p_k}p1p2⋅...⋅pkn一定是3的倍数,且(3−1)=2(3 - 1) = 2(3−1)=2同时又是右边的因子,故nnn的欧拉函数一定是合数,不是质数(nnn是2×32\times 32×3的倍数)。
- 若b=0b=0b=0,则ϕ(n)=n2\phi(n)=\frac{n}{2}ϕ(n)=2n,只有当a=2a=2a=2时nnn的欧拉函数是质数。
- 若b=1b=1b=1,
- 若a>1a>1a>1,则np1p2⋅...⋅pk\frac{n}{p_1p_2\cdot...\cdot p_k}p1p2⋅...⋅pkn一定是2的倍数,且(3−1)=2(3 - 1) = 2(3−1)=2同时又是右边的因子,故nnn的欧拉函数一定是合数,不是质数。
接下来讨论a=0a=0a=0和a=1a=1a=1,最后总结得出欧拉函数为质数的正整数只有3,4,63, 4, 63,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';
}