一节英语课,口胡一个筛子
在 \(O(\frac {n^{\frac 3 4}} {\log n})\) 的时间内求出一个积性函数的 块筛,要求 在质数处的值为项数不多的多项式,质数幂处的计算方法只要不是太慢都可以接受。
灵感来源:这个帖子,以及与@wkywkywky 的聊天记录:
于是依照这个思路,我给你一个积性函数 \(f(p^k)\),考虑杜教筛。
假设我配对的是 \(g\),并且有 \(f * g = h\)。
考虑构造一个 \(g\),使 \(h\) 在质数处的值为 \(0\),这样一来有值的位置就都是 PN 了。而这样的 \(g\) 很容易构造,容易知道 \(g(p)=-f(p)\)。
然后继续构造使得 \(g(p^k)=0\)(\(k \geq 2\))。
于是 \(h\) 只在质数处有值,在每次杜教筛时使用爆搜的复杂度是对的(甚至可以开一个数组二分来做到 \(O(\sqrt n)-O(\log n)\)),接下来考虑如何计算 \(g\) 的前缀和。
考虑类似 min25 筛的 DP。
我们令最开始时,不大于 \(\sqrt n\) 的 \(g(p)=1\),其他 \(g(p)=-f(p)\)。
于是先跑一遍质数前缀和求出 \(f\) 的前缀和。
然后我们从小到大枚举不大于 \(\sqrt n\) 的质数,然后让 \(g(p)=-f(p)\),也就是令 \(g(p)-=f(p)+1\),然后暴力枚举来更新,大概就是:
初值为 \(g[n][0]=-\sum_{p \leq n}f(p)\)。
于是做到了 \(O(\frac {n^{\frac 3 4}}{\log n})\)。
不过翻了一下 cmd 的博客,感觉这玩意儿早就被提出来了。。。
以及,应该是很容易优化到 \(O(n^{\frac 2 3})\) 的。