这题实在是比较一棵赛艇就发上来好了。
题目:
给定n,求出小于等于n的所有合数的最小质因数之和。
对于70%的数据,n<=10^7。
对于100%的数据,n<=10^9。
题解:
70% 线筛大法好
100%
首先我们考虑对于每一个小于等于sqrt(n)的质数容斥,然后稍微推一推就可以得到一个比较靠谱的容斥方法,虽然复杂度玄学但是似乎跑得蛮快的。然后我们测一下时间……真是不巧n=10^9要跑2s左右。(我就是这么被卡掉的
标程是这样的:
我们定一个阀值k=100,对于<=k的质因数(一共也就才几十个)我们用科学的容斥搞一搞,这个复杂度基本没有。
对于>=k的质因数p我们可以发现n/p是在10^7以内的。然后为了保证质因数是最小的,我们必须只能选n不是<p质数的倍数的。那么我们发现n/p显然也要不是<p质数的倍数。
这样我们用一个暴力筛法来维护n/p,具体做法是因为p递增时n/p递减,那么我们考虑线筛的上界也是递减的,每次线筛赋值bool数组的时候顺便更新一下答案,减小上界的时候就把多的答案扣掉。既然1kw的暴力筛法可以过,这样显然是科学的。
n=10^9只要跑0.1s左右。事实上如果把k设成1000跑n=10^10也只要跑0.6s左右。
#include #include #include #include #include #include #include #include #include #include #include
嗯今天闫神还立了一个flag,说不会求质数的答案。那我们就是要求n以内质数的和。
丢链接跑