数论分块(除法分块)

定义

数论分块是个很常见的技巧,常用于计算$$\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;


posted @ 2023-01-24 12:05  wxk123  阅读(47)  评论(0)    收藏  举报