整除分块加速取余

传送门
\(\sum_{i = 1}^{n}k \ mod \ i\)

\(k \ mod \ i = k - \lfloor \frac{k}{i} \rfloor*i\)

\(\sum_{i = 1}^{n}k \ mod \ i = kn - \sum_{i = 1}^{n}\lfloor \frac{k}{i}\rfloor*i\)

比整除分块模板多了i,而i在每一个分块是一个等差数列,可以用求和公式求。

#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
int main(){
    ll n,k;
    cin >> n >> k;
    ll ans = n * k;
    for(int l = 1, r; l <= n; l = r + 1){
        r = k / l ? min(k / (k / l), n) : n;
        ans -= (k / l) * (r - l + 1);
    }   
    cout << ans << endl;
    return 0;
}
posted @ 2020-01-30 21:15  Emcikem  阅读(199)  评论(0编辑  收藏  举报