这道题要找(a,b)之间素数的个数,典型的素数筛,但是数据范围到,显然无法直接筛
只用(0,)的素数去筛(a,b)这个范围
首先要获得(0,)的素数,其次要获得prime[j]第一个≥a的整数倍,及ceil(a/prime[j])*prime[j]
关于向上取整有个小技巧 (a+prime[j]-1)/prime[j]
标记(a,b)是否为素数时,以a为数组起点记录信息
注意中间过程不要溢出
要注意的一个wa 点是用interval数组存时,若a==1,没有素数能够更新到1,因此答案会多以
这题要找把一个数分解成两个square-free数的方法种数。规律已经找到了,做题的时候采用暴力的策略,每个数跑完所有它能分解的素数,如果有一个幂次为3,答案为0,有一个幂次为2,不修改,幂次为1则答案乘2。 完美地TLE了
没有想到提取出一个数的最小素因子,然后写个递推式
写递推关系,将问题转化至求
说明最大公约数为i的有
个,所以
,其中i能整除n
正向思考的话是遍历小于n的所有数,如果是n的因数就去更新一下。 这里就可以用筛优化!
我觉得思想是一样一样的
for(int i=1;i<=N;++i)
for(int j=2*i;j<=N;++j)
f[j]+=i*euler[j/i];