洲鸽筛学习笔记
\(\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})\)