UVA 11440 - Help Tomisu(素数筛选+容斥原理+逆元 or 欧拉函数)

该博客介绍了如何解决UVA 11440问题,即计算在一定范围内所有素因子大于指定数m的数的个数。博主提供了两种解题方法,第一种利用容斥原理和逆元,通过递推公式计算;第二种方法结合欧拉函数的性质简化计算。博主强调理解欧拉函数的推导过程对于解题至关重要,并给出了相应的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

题目大意:给定两个数N,M(1<N<=10^7,M<N),求2N!的所有数中,所有素因子都大于m的数的个数,答案模以10^8+7

题解:

个人的解法1:

反过来计算存在素因子小于等于m的数的个数,假设小于m的素数有k个a1,a2,a3...ak

那么N!/a1,就是小于等于N!的数中包含素因子a1的数的个数,N!/a1a2就是同时包含素因子a1和a2的数的个数,那么根据容斥原理,我们可以这样计算

N!/a1+N!/a2+....+N!/ak-N!/a1a2-N!/a1a3.....+N!/a1a2a3.....

奇数个素因子的组合就加,偶数个素因子的组合就减,就能计算出答案。

暴力枚举所有组合情况显然复杂度太高,接下来才是解决问题的关键,如何计算这个值?

我个人的方法,通过递推求解,我们从前往后求,假设我们已经求得了前i个素数的结果为f(i)=N!/a1+..N!/a2-N!/a1a2......

现在第i+1个数加入进来,那么我们首先加上N!/a_{i+1},第i+1个素数和其它素数的组合怎么计算了,只需要减去f(i)/a_{i+1}即可,即f(i)的每一项除以a_{i+1},但是符号要改变,所以前面加个减号。

所以我们可以得到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值