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 }

 

posted @ 2019-05-25 16:26  Lancelot&  阅读(196)  评论(0编辑  收藏  举报