min_25筛用于求一类积性函数的前缀和,其使用条件为:
- $f(p)$是一个关于p的简单多项式
- $f(p^c)$可以快速的计算
约定$P_i$为第i个质数,prime表示质数集合,$ver(i)$表示i的最小质因子
本文所有代码的取模计算用函数实现,具体代码如下:
1 | typedef long long ll; |
并且预处理出$sqrt {n}$的所有素数以及前缀和
1 | int prime[N],pre[N],pcnt,v[N]; |
我们先考虑将函数全部写成质数时的表达式子,然后求出所有为质数的值,即对于每个n/i,求出
$$
g[n]=sum_{(jle n) and (j in prime)} f(j)
$$
我们记$g[n][j]$表示g[n]筛去前 j 个质数的倍数的情况
显然$P_j^2>n$的时候不会筛掉任何数,考虑容斥掉之前的质数的情况,我们有:
$$
g[n][j]=g[n][j-1] (P_j^2>n)
$$
$$
g[n][j]=g[n][j-1]-f(P_j)(g[frac {n} {P_j}][j-1]-sum_{i=1}^{j-1}f(P_i)) (P_j^2le n)
$$
$$
g[n][0]=sum f(i)(按照iin prime 算)
$$
以下以筛素数个数以及筛素数和为例
1 | for(ll u=1,v;u<=n;u=v+1){ |
同样的我们可以考虑容斥掉合数。
首先我们定义$S(n,j)=sum _{i=1}^{n} [ver(i)ge P_j]f(i)$
则有$ans=S(n+1)+f(1)$
质数部分的答案是 $h(n,j)=g[n][j]-sum_{i=1}^{j-1}f(P_i)$
然后我们枚举最小的质因子并且枚举次幂,有
$$
S(n,j)=h(n,|prime|)+sum_{k=j}^{P_k^2le n}sum_{e=1}^{P_k^{e+1}le n}S(frac{n}{P_k^e},k+1)times f(P_k^e)+f(P_k^{e+1})
$$
边界是$(nle 1 )or( P_j>n)$
首先把$f[i]$当成$i-1$求素数和以及素数个数,相减就是素数的和(2要特判一下)然后直接跑合数的就行了
代码
1 |
|
原文:https://www.cnblogs.com/lijianming180/p/12375933.html