题目链接
题目类型:模拟 + 筛法
题目分析
题目大意
给出一个n,一个d,找出小于n且最大因子为d的数的数量
解析
当d为素数时,显然只能用比d小且和d相乘小于n的素数。当d为合数时,要先找出来d中最小的质因子,该质因子可以被小于等于他的替换,也就是说,对于一个合数来讲,能组成的数字为小于等于其最小质因子且相乘之后小于n的素数。
所以我们一开始筛素数表的时候,就把每个数字的最小质因子筛出来,存在fac[]数组中。计算结果时,首先可以确定一个事情,最多只能有num[min((n-1)/d, fac[d])]个情况,其中(n-1)/d是当n不足够大的时候,d能乘以(n-1)/d以内的素数,所以共有num[(n-1)/d]种情况,当n足够大,大于fac[d]*fac[d]的时候,只能取所有小于等于fac[d]的素数了,这种情况共有num[fac[d]]个情况。
有一种特殊情况,当d大于我们的阈值时,要怎么处理?显然,上面的分析是无法处理d大于我们阈值的情况的,所以对于这些数字,我们可以先假定它是合数,那么必然在我们阈值范围内,存在他的一个质因子。当我们找到他的最小质因子的时候,直接返回num[fac[d]]即可,因为是遍历出来的,所以当前的这个值,及之前的值是可取的。若跑完我们范围内的素数,仍然没有找到的话,说明他是素数,直接认为(n-1)/d范围内的所有素数都可以作为结果即可,也就是num[(n-1)/d]。
代码
1 |
|