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

题目大意:

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

解:

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

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

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

考虑欧拉函数的公式ϕ(n)=n(11p1)(11p2)...(11pk)=np1p2...pk(p11)(p21)...(pk1),其中p1,p2,,pkn的所有质因数。

注意到上式中np1p2...pk必定为一个正整数

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

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

  2. n的质因数只有23,设n=2a3b

    • b>1,则np1p2...pk一定是3的倍数,且(31)=2同时又是右边的因子,故n的欧拉函数一定是合数,不是质数(n2×3的倍数)。
    • b=0,则ϕ(n)=n2,只有当a=2n的欧拉函数是质数。
    • b=1
      • a>1,则np1p2...pk一定是2的倍数,且(31)=2同时又是右边的因子,故n的欧拉函数一定是合数,不是质数。

接下来讨论a=0a=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 @   lightmon  阅读(133)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示