求解一类函数 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,x−1)−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],x−1)−g(p[x]−1,x−1))
可以理解为提取了一个 p [ x ] p[x] p[x]因子, g ( n / p [ x ] , x − 1 ) g(n/p[x],x-1) g(n/p[x],x−1)前面还有一些质数,这些质数的和即后者。
观察,可以发现 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) ∏P∈xfk(P)
而不是
∏ P ∈ x f ( P K ) \prod_{P \in x}f(P^K) ∏P∈xf(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) .