Comet OJ - Contest #4 B題 奇偶性

題目連接:https://www.cometoj.com/contest/39/problem/B?problem_id=1577ios


 

題意:給你一個數列,求L 到 R 區間內 全部數列 (ƒn mod 2)的和。spa

思路:這題是個找規律的題目,首先數列都要對2取模運算,若是這個數是偶數 那麼mod 2就是0,奇數就是1,因此這題等價於求 L 到 R 區間內奇數的個數。3d

   1.當 k 爲奇數的時候,咱們發現數列的值對2取模後全爲1,因此 ans = R - L + 1。code

   2.當 k 爲偶數的時候,假設 k = 4,那麼:blog

ƒ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 表示偶數。ci

   如圖 能夠發現循環的規律,咱們用除法取模的方法能夠算出 1 - n 區間內 0 的節點有 ((n - k) / (k + 1) + 1) 個,因此對 k 所在區間進行分類討論就行了。get

AC代碼:it

 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         {
16
17 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 }
相關文章
相關標籤/搜索