数论分块

数论分块用于计算\(\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;
  }