洲鸽筛学习笔记

\(\sum_{i\ =\ 1}^N\ F(i)\ =\ \sum_{i\ =\ 1}^{\sqrt{N}}\ F(i)\cdot (\sum_{j\ =\ \sqrt{N}\ +\ 1}^{N}\ [j是质数]F(j))\ +\ \sum_{i\ =\ 1}^{N}\ [i无>\sqrt{N}的质因子]F(i)\)

所以求解分为两部分

1.\(\sum_{j\ =\ \sqrt{N}\ +\ 1}^{N}\ [j是质数]F(j)\)

2.\(\sum_{i\ =\ 1}^{N}\ [i无>\sqrt{N}的质因子]F(i)\)

\(\leq\ \sqrt{N}\) 的质数为 \(P_1,\ P_2,\ P_3,\ ...,\ P_m\)

对于第一部分:

考虑对\(p^k\)分开来算和,令 \(dp_k[i][j]\) 表示 \([1,\ j]\) 内与 \(P_{1,\ 2,\ ...,\ i}\) 互质的数的\(k\)次方的和,则有:

\(dp_k[i][j]\ =\ dp_k[i\ -\ 1][j]\ -\ P_i^k\cdot dp_k[i\ -\ 1][\left \lfloor \frac{j}{p_i} \right \rfloor]\)

全部计算总复杂度 \(O(\frac{N}{log\ N})\),考虑对dp进行优化

可以发现当 \(P_i\ >\ j\) 时,\(dp_k[i][j]\ =\ [j\ >\ 0]\),当\(P_i\ \leq\ j\ <\ P_i^2\)时,\(dp_k[i][j]\ =\ dp_k[i\ -\ 1][j]\ -\ P_i^k\),所以对于每个 \(j\) 可以分成两段计算:

\(P_i^2\ \leq\ j\) 时暴力进行转移

\(P_i^2\ >\ j\) 时停止转移,之后需要调用此dp值的时候补上未计算的和

实现的时候可以用滚动数组:开两个数组 \(f,\ g\)\(f(i)\) 表示 \(dp_k[x][i]\)\(g(i)\) 表示\(dp_k[x][\left \lfloor \frac{N}{i} \right \rfloor]\) (\(x\)为滚动的下标)

由于只要求 \(F(p)\),所以对于一些题目,只需要算 \(P_i^0\) 的和即可

对于第二部分:

\(dp_k[i][j]\) 表示 \([1,\ j]\) 内,质因数只有 \(P_{i,\ i\ +\ 1,\ ...,\ m}\) 的数的 \(F\) 值的和,则有

\(dp_k[i][j]\ =\ dp_k[i\ +\ 1][j]\ +\ \sum_{c\ =\ 1}\ dp_k[i\ +\ 1][\left \lfloor \frac{j}{p_i^c} \right \rfloor]\cdot F(p_i^c)\)

全部计算总复杂度 \(O(\frac{N}{log\ N})\),考虑对dp进行优化

可以发现当 \(P_i\ >\ j\) 时,\(dp_k[i][j]\ =\ 1\),当 \(P_i\ \leq\ j\ <\ P_i^2\) 时,\(dp_k[i][j]\ =\ dp_k[i\ +\ 1][j]\ +\ F(p_i)\),所以对于每个 \(j\) 可以分成两段计算:

\(P_i^2\ \leq\ j\) 时暴力进行转移

\(P_i^2\ >\ j\) 时停止转移,之后需要调用此dp值的时候补上未计算的和

因此总复杂度 \(O(\frac{N^{\frac{3}{4}}}{log\ N})\)

posted @ 2017-11-14 08:25  King_George  阅读(250)  评论(0编辑  收藏  举报