min_25筛

min_25筛


用处:

求解一类函数 F ( x ) F(x) F(x)的前缀和,满足:

1.对于质数 p p p F ( p k ) F(p^k) F(pk)方便计算。(计算S的时候需要算增量)

2.对于质数, F ( p ) F(p) F(p)为一个简单多项式(可以快速算前缀和)。

不支持多组数据。


算法步骤:

设P为质数集合。

定义g(n,x)为1到n中,质数或者最小值因子>p[x]的合数。

换句话说,这里的g(n,x)为做完前x次埃氏筛后剩下的元素。

那么,有式子:

g ( n , x ) = g ( n , x − 1 ) − X , X g(n,x)=g(n,x-1)-X,X g(n,x)=g(n,x1)X,X为偏移量,也就是第x轮被筛掉的数。它们就是最小质因子为p[x]的所有合数。

考虑计算 X X X

X = f ( p [ x ] ) ∗ ( g ( n / p [ x ] , x − 1 ) − g ( p [ x ] − 1 , x − 1 ) ) X=f(p[x])*(g(n/p[x],x-1)-g(p[x]-1,x-1)) X=f(p[x])(g(n/p[x],x1)g(p[x]1,x1))

可以理解为提取了一个 p [ x ] p[x] p[x]因子, g ( n / p [ x ] , x − 1 ) g(n/p[x],x-1) g(n/p[x],x1)前面还有一些质数,这些质数的和即后者。

观察,可以发现 g ( n , 0 ) g(n,0) g(n,0)即为所有数的 F F F之和, g ( n , ∣ p ∣ ) g(n,|p|) g(n,p)为所有质数的 F F F之和。

我们要求的就是 g ( n , ∣ p ∣ ) g(n,|p|) g(n,p)

但我们发现其实出了点小问题,就是我们的计算其实不是满足定义式的。对于一个合数 x x x,我们计算的方法好像是:

∏ P ∈ x f k ( P ) \prod_{P \in x}f^k(P) Pxfk(P)

而不是

∏ P ∈ x f ( P K ) \prod_{P \in x}f(P^K) Pxf(PK)

但是没有关系,我们把所有合数的计算都用质数的方法计算。因为所有合数最后都要被消掉,最后只剩下质数的答案也就是 g ( n , ∣ p ∣ ) g(n,|p|) g(n,p)

至此,我们计算了所有的质数答案,我们现在来算合数的答案。

记录 S ( n , x ) S(n,x) S(n,x)为所有最小质因子>x的数的和。注意这里没有质数这一条件。

S ( n , x ) = g ( n , ∣ p ∣ ) − ∑ i = 1 x f ( p [ i ] ) + ∑ k = x + 1 s q r t ( n ) ( ∑ i , p [ k ] i < = n f ( p [ k ] i ) + ∑ i , p [ k ] i + 1 < = n f ( p [ k ] i ) ∗ S ( n / ( p [ k ] i ) , k ) ) S(n,x)=g(n,|p|)-\sum_{i=1}^xf(p[i])+\sum_{k=x+1}^{sqrt(n)}(\sum_{i,p[k]^i<=n}f(p[k]^i)+\sum_{i,p[k]^{i+1}<=n}f(p[k]^i)*S(n/(p[k]^i),k)) S(n,x)=g(n,p)i=1xf(p[i])+k=x+1sqrt(n)(i,p[k]i<=nf(p[k]i)+i,p[k]i+1<=nf(p[k]i)S(n/(p[k]i),k))

其实逐位分析不难。

前两项计算完为所有质数的值。

后面计算合数,枚举最小质因子所在的位置。

第一种,只含有这一个质因子,就是第三项。第二种,还有其他的,就是第四项。

最后答案为 S ( n , 0 ) + F ( 1 ) S(n,0)+F(1) S(n,0)+F(1) .

你可能感兴趣的:(算法)