数论分块(除法分块)
定义
数论分块是个很常见的技巧,常用于计算$$\sum_{i=1}^{n} \left[\frac{k}{i} \right] $$
思路
原理很简单:设\(t_i \in\{x|x=\left[\frac{k}{i}\right]\}\)我们想办法每次计算出一个\(t_i\)的贡献,即一次求出一个\(\left[\frac{k}{i} \right]\)的值对答案的贡献,这样复杂库大约是\(O(\sqrt{n})\),即n的约数个数
代码
代码实现是很简单的,这里是实现$$\sum_{i=1}^{n}\text{k%i}=\text{n*k-} \sum_{i=1}^{n} i*\left[\frac{k}{i} \right] = ans$$的计算的示例
int anss=0;
cin>>n>>k;
anss+=n*k;
int r;
for(int l=1;l<=n;l=r+1){
t=k/l;
if(t==0)
break;
r=min(n,k/t);
anss-=(r+l)*(r-l+1)/2*t;
}
cout<<anss;

浙公网安备 33010602011771号