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

题目大意:

求区间[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)=y1,易证yyy为质数(注意ϕ(1)=1\phi(1) = 1ϕ(1)=1111与任何正整数都互质)。

故原问题转化为求[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(1p11)(1p21)...(1pk1)=p1p2...pkn(p11)(p21)...(pk1),其中p1,p2,…,pkp_1, p_2, \dots, p_kp1,p2,,pknnn的所有质因数。

注意到上式中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,...

  1. nnn的质因数中包含≥5\ge55的数时,设该数为mmm,则m−1m - 1m1一定是一个合数(因为这个范围内的质数一定都是奇数,且每两个质数之差≥2\ge22),故nnn的欧拉函数不是质数。

  2. nnn的质因数只有222333,设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(31)=2同时又是右边的因子,故nnn的欧拉函数一定是合数,不是质数(nnn2×32\times 32×3的倍数)。
    • b=0b=0b=0,则ϕ(n)=n2\phi(n)=\frac{n}{2}ϕ(n)=2n,只有当a=2a=2a=2nnn的欧拉函数是质数。
    • 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(31)=2同时又是右边的因子,故nnn的欧拉函数一定是合数,不是质数。

接下来讨论a=0a=0a=0a=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';
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值