洛谷P2261 餘數求和

整除分塊的小應用。ide

考慮到 k % x = k - (k / x) * xspa

因此把 x = 1...n 加起來就是 k * n - (k / i) * icode

i = 1...k(注意這裏是k)blog

對於這個 k / i 就能夠整除分塊了。it

還要注意 k 與 n 的大小關係。io

當 k < n 的時候,只需減去不大於k的部分便可。event

當 n < k 的時候,注意別讓 i > n 就好了。class

 1 #include <cstdio>
 2 #include <algorithm>
 3 typedef long long LL;
 4  
 5 inline void solve() {
 6     LL n, k;
 7     if(scanf("%lld%lld", &n, &k) == EOF) {
 8         exit(0);
 9     }
10     LL ans = n * k;
11     for(LL i = 1, j; i <= std::min(k, n); i = j + 1) {
12         j = std::min(k / (k / i), n);
13         ans -= (k / i) * ((i + j) * (j - i + 1) / 2);
14     }
15  
16     printf("%lld", ans);
17     return;
18 }
19  
20 int main() {
21     solve();
22     return 0;
23 }
AC代碼
相關文章
相關標籤/搜索