数论分块
数论分块用于计算\(\sum_{i=1}^{n}f(i)g(\lfloor\frac{n}{i}\rfloor)\)这样的式子。
在对n取整时计算会出现i\(\in\)[l,r],使得\(\lfloor\frac{n}{i}\rfloor\)出现一片相同的值区域(块)。可以将块看做是一个整体从而减少计算次数,降低时间复杂度。
确定左端点l,\(k=\lfloor\frac{n}{l}\rfloor\),找到右端点r的最大值,假设k=\(\lfloor\frac{n}{r}\rfloor\),\(k<=\frac{n}{r}<k+1\),所以\(r<=\frac{n}{k}\),因为r是整数,
所以\(r=\lfloor\frac{n}{k}\rfloor\),k在这个区间内是相等的,所以\(r=\lfloor\frac{n}{\lfloor\frac{n}{l}\rfloor}\rfloor\)。
在下一个块,l=r+1。
模版
int sum(int n){
int ans=0;
for(int l=1,r;l<=n;l=r+1){
r=n/(n/l);
ans+=(r-l+1)*(n/l);
}
return ans;
}