前置知识:min25筛学习
在学习min25筛之后,我们知道有 S S S函数的递推式
S ( n , i ) = g ( n , ∣ p r ( n ) ∣ ) − g ( p r i , ∣ p r ( n ) ∣ ) + ∑ j > i ∑ p r j k ≤ n f ( p r j k ) × ( S ( ⌊ n p r j k ⌋ , j ) + [ k > 1 ] ) S(n,i)=g(n,|pr(n)|)-g(pr_i,|pr(n)|)+\sum\limits_{j>i}\sum\limits_{pr_j^k\leq n}f(pr_j^k)\times (S(\lfloor\dfrac{n}{pr_j^k}\rfloor,j)+[k>1]) S(n,i)=g(n,∣pr(n)∣)−g(pri,∣pr(n)∣)+j>i∑prjk≤n∑f(prjk)×(S(⌊prjkn⌋,j)+[k>1])
其中 g ( n , ∣ p r ( n ) ∣ ) − g ( p r i , ∣ p r ( n ) ∣ ) g(n,|pr(n)|)-g(pr_i,|pr(n)|) g(n,∣pr(n)∣)−g(pri,∣pr(n)∣)表示 n n n以内大于 p r i pr_i pri的质数的 f f f值之和。后面相当于求 n n n以内不是质数的最小质因子大于 p r i pr_i pri的数的 f f f值之和。当 k = 1 k=1 k=1时, f ( p r j ) f(pr_j) f(prj)在前面已经被计算过了,所以不用加1;当 k > 1 k>1 k>1时, p r j k pr_j^k prjk不是质数,所以要加上。
那我们想想,如果改为以下式子,那么 g g g函数是不是就不用求了呢?
S ( n , i ) = ∑ j > i ∑ p r j k ≤ n f ( p r j k ) × ( S ( ⌊ n p r j k ⌋ , j ) + 1 ) S(n,i)=\sum\limits_{j>i}\sum\limits_{pr_j^k\leq n}f(pr_j^k)\times (S(\lfloor\dfrac{n}{pr_j^k}\rfloor,j)+1) S(n,i)=j>i∑prjk≤n∑f(prjk)×(S(⌊prjkn⌋,j)+1)
修改后,意义不变,此时不需要 g g g函数, S S S的值仍能正确求出,那我们是否可以用这个递推式来求 S S S呢?
这是不行的。注意当 + [ k > 1 ] +[k>1] +[k>1]变为 + 1 +1 +1时,若 k = 1 k=1 k=1, p r j 2 > n pr_j^2>n prj2>n,则 p r j pr_j prj也有贡献,这就要求我们求出 n n n以内的所有质数。一般的 n n n都是 1 0 9 10^9 109以上的级别的,这显然是不可行的。
其实设置 g g g函数的意义就是求 f f f在大质数处的值,所以 g g g函数不能省去。上述的 S S S的递推式虽然正确,但是如果要实现的话,需要求出并存储 1 1 1到 n n n的所有质数,时间复杂度和空间复杂度都很大。