Comet OJ - Contest #4 B题 奇偶性

吃可爱长大的小学妹 提交于 2020-01-17 02:25:22

题目链接: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 }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!