整除分塊的小應用。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 }