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