Appearance
对于
仿照挨氏筛,时间复杂度:
点击展开代码
cpp
bitset<N> not_prime;
not_prime[1] = 1;
for (int i = 2; i <= n; i++) {
if (not_prime[i])
continue;
for (int j = i; j <= n; j += i) {
a[j] += a[j / i];
not_prime[j] = 1;
}
}Dirichlet 后缀和:
对于
稍微变形一下。对于同一个质数 a[j],再继续传递到 a[j / i];若从小到大更新,后加入 a[j] 的贡献将无法继续向下传递。
点击展开代码
cpp
bitset<N> not_prime;
not_prime[1] = 1;
for (int i = 2; i <= n; i++) {
if (not_prime[i])
continue;
for (int j = n / i * i; j >= i; j -= i) {
a[j / i] += a[j];
not_prime[j] = 1;
}
}