Comet OJ - Contest #4--前缀和
原题:Comet OJ - Contest #4-B
https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门
一开始就想着暴力打表,结果。。
前缀和是个很好的工具,本题可以用相邻前缀和之差得到结果。
例如:K=4:
1 | 1 | 1 | 1 |
0 | 1 | 1 | 1 |
1 | 0 | 1 | 1 |
1 | 1 | 0 | 1 |
1 #include <cstdio> 2 3 using int64 = long long; 4 5 int main() { 6 int T; 7 scanf("%d", &T); 8 for (int cas = 1; cas <= T; ++cas) { 9 int64 l, r, k; 10 scanf("%lld%lld%lld", &l, &r, &k); 11 if (k & 1) printf("%lld\n", r - l + 1); 12 else { 13 auto sum = [] (int64 n, int64 k) { 14 if (n < k) return n + 1; 15 int64 l = n / k; 16 int64 zeros = l / (k + 1) * k; 17 if (l % (k + 1)) { 18 zeros += l % (k + 1) - 1; 19 zeros += n % k >= l % (k + 1) - 1; 20 } 21 return n + 1 - zeros; 22 }; 23 printf("%lld\n", sum(r, k) - sum(l - 1, k)); 24 } 25 } 26 return 0; 27 }