BZOJ1257: [CQOI2007]余数之和——整除分块
题意
求 $\sum _{i=1}^n k \ mod \ i$($1\leq n,k\leq 10^9$).
分析
数据范围这么大 $O(n)$ 的复杂度也挺不住啊
根据取模的意义,$k \ mod \ i = k - \left \lfloor \frac{k}{i} \right \rfloor * 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\n", solve()); return 0; }
参考链接:https://zhuanlan.zhihu.com/p/77687419
个性签名:时间会解决一切