【模板】Dirichlet 前缀和
求
$n \le 2\times 10^{7}$
看代码:
1 | for( int i = 1 ; i <= en && pri[i] <= n ; ++ i ) { |
为啥这么做它是对的呢?发现每个数字会被它除以所有质因子转移到,并且是按照质因子从小到大来的。
所以这个代码相当于,对所有质因子递归求,然后对对所有质因子搞前缀和。
形式和 埃筛 一样,复杂度也是$O(n\log\log n)$
然后考虑这个
看代码:
1 | for( int i = 1 ; i <= en && pri[i] <= n ; ++ i ) { |
首先,我们发现最主要的区别在于,我们应当从 一个数字本身 转移到 这个数字除以所有质因子。因为是从大到小转移的,所以也需要逆序枚举$j$。
最后考虑这个:
也是已知$A$求$B$
这种情况其实就是第一种情况反过来,我们也可以直接把循环顺序和转移方法给反过来
1 | for( int i = en ; i ; -- i ) { |
第二种情况也可以反过来,就不赘述了。
例题:CF585E