题意
求 $sum _{i=1}^n k mod i$($1leq n,kleq 10^9$).
分析
数据范围这么大 $O(n)$ 的复杂度也挺不住啊
根据取模的意义,$k mod i = k - left lfloor frac{k}{i} ight floor * i$,
因此可以用整除分块,注意分类讨论 $k$ 与 $n$ 的关系。
#include<bits/stdc++.h> using namespace std; typedef long long ll; int n, k; ll solve() { ll ret = 1LL * n * k; if(k <= n) //需要分类讨论 { for(int i = 1,j;i <= k;i = j+1) { j = k / (k / i); ret -= 1LL * (i+j) * (j-i+1) / 2 * (k / i); } } else { for(int i = 1,j;i <= n;i = j+1) { j = min(k / (k / i), n); ret -= 1LL * (i+j) * (j-i+1) / 2 * (k / i); } } return ret; } int main() { scanf("%d%d", &n, &k); printf("%lld ", solve()); return 0; }