题目链接:https://www.cometoj.com/contest/39/problem/B?problem_id=1577


题意:给你一个数列,求L 到 R 区间内 所有数列 (ƒn mod 2)的和。
思路:这题是个找规律的题目,首先数列都要对2取模运算,如果这个数是偶数 那么mod 2就是0,奇数就是1,所以这题等价于求 L 到 R 区间内奇数的个数。
1.当 k 为奇数的时候,我们发现数列的值对2取模后全为1,所以 ans = R - L + 1。
2.当 k 为偶数的时候,假设 k = 4,那么:
| ƒ0 | ƒ1 | ƒ2 | ƒ3 | ƒ4 | ƒ5 | ƒ6 | ƒ7 | ƒ8 | ƒ9 | ƒ10 | ƒ11 | ƒ12 | ƒ13 | ƒ14 |
| 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 |
我们知道偶数个奇数相加和等于偶数,奇数个等于奇数,为了方便我们用 1 表示奇数 用 0 表示偶数。
如图 可以发现循环的规律,我们用除法取模的方法可以算出 1 - n 区间内 0 的节点有 ((n - k) / (k + 1) + 1) 个,所以对 k 所在区间进行分类讨论就好了。
AC代码:
1 #include<cstdio>
2 #include<iostream>
3 #include<algorithm>
4 using namespace std;
5 int main()
6 {
7 int n;
8 long long l,r,k;
9 cin >> n;
10 while(n--)
11 {
12 scanf("%lld%lld%lld",&l,&r,&k);
13 long long ans = 0;
14 if(k % 2 == 0)
15 {1617 if(k >= r)
18 {
19 if(r == k)
20 ans = r - l;
21 else
22 ans = r - l + 1;
23 }
24 else if(k < l)
25 {
26 long long ll,rr;
27 ll = l - ((l - k) / (k + 1) + 1);
28 rr = r - ((r - k) / (k + 1) + 1);
29 ans = rr - ll + 1;
30 }
31 else
32 {
33 ans = r - ((r - k) / (k + 1) + 1) - l + 1;
34 if(l == k) ans += 1;
35 }
36 }
37 else
38 {
39 ans = r - l + 1;
40 }
41 printf("%lld\n",ans);
42 }
43 return 0;
44 }
来源:https://www.cnblogs.com/Carered/p/10920590.html