题意:
分析:
假设,则k mod (i+1) = k - (i+1)*p = k - i*p - p = k mod i - p
则对于某个区间,i∈[l, r],k/i的整数部分p相同,则其余数成等差数列,公差为-p
然后我想到了做莫比乌斯反演时候有个分块加速,在区间[i, n / (n / i)],n/i的整数部分相同,于是有了这份代码。
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 typedef long long LL; 5 6 int main() 7 { 8 LL n, k; 9 while(scanf("%lld%lld", &n, &k) == 2) 10 { 11 LL ans = 0; 12 LL i, j, r = min(n, k); 13 for(i = 1; i <= r; i = j + 1) 14 { 15 j = k / (k / i); 16 if(j > r) j = r; 17 18 LL d = -k / i; 19 LL l = j - i + 1; 20 LL a1 = k % i; 21 ans += (LL) (a1*l + l*(l-1)/2*d); 22 } 23 if(n > k) 24 ans += (LL) (n-k) * k; 25 26 printf("%lld\n", ans); 27 } 28 29 return 0; 30 }