这题其实就是求
这题和整除分块又有什么关系呢?
mod没有什么特殊的性质,所以我们将它展开来,就变成了
于是我们就看到了一个熟悉的形式,也就是整除分块的一般形式
再次改一下这个式子
那么和普通的整除分块有什么差别呢?
其实就是多了一个i
确实,就是多了一个i而已,只需要简单的化简一下,这个i就对我们的处理没有什么影响了
因为我们知道,对于一个整除分块,其中的每个值都是相同的,于是我们可以设
式子就化为了
也就是说,其实这个式子前半段是一个整除分块,后半段是一个首项为l,公差为1的等差数列
至此,我们就圆满的解决了这个问题,可以在的时间内解决本题
#include <bits/stdc++.h> #define ll long long ll n, k; ll ans = 0; int main() { scanf("%lld%lld", &n, &k); ans = n * k; for(int l = 1, r = 1; l <= n; l = r + 1) { if(k/l != 0) r = std::min(k / (k / l), n); else r = n; ans = ans - 1ll * ((r+l) * (k/l) * (r-l+1)) / 2; } printf("%lld\n", ans); return 0; }