题目描述:
给出两个整数 a k,表示首项(第 1 项)为 a,公差为 k 的等差数列 A。
数列 A有无穷项,形如
A1=a
A2=a+k
A3=a+2×k
.........
有 q 次询问,每次询问给出两个整数 l,r,如果 A 第 l项到第 r 项中,奇数较多输出 1,偶数较多输出 −1,数量一样输出 0。
输入描述:
输出描述:
输出包含 q行,每行包含一个整数。
示例1
输入
3 1 3
1 3
2 4
5 6
输出
1
-1
0
说明
题解思路:
利用数列奇偶性的关系进行求解。
(1)当(a + (l - 1)和公差为偶数时,数列中的值只能为偶数。
(2)当(a + (l - 1)和公差为奇数时,数列中的奇数的个数为大于或等于偶数个数,当区间内为偶数时奇偶数数目相等,反之,奇数个数多于偶数个数。
(3)当(a + (l - 1)为奇数且公差为偶数时,数列中只有奇数
(4)当(a + (l - 1)为偶数且公差为奇数时,数列中的偶数个数为大于或等于偶数个数,当区间内为偶数时奇偶数数目相等,反之,偶数个数多于奇数个数。
代码实现:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 400001
unsigned long long int a, k;
unsigned long long int q, l, r;
long long int arry[N];
int funs(long long int a, unsigned long long int k, unsigned long long int l, unsigned long long int r){
// (a + (l - 1)和公差为偶数的时候
if (k % 2 == 0 && (a + (l - 1) * k) % 2 == 0) return -1;
// (a + (l - 1)和公差为奇数的时候
if (k % 2 == 1 && (a + (l - 1) * k) % 2 == 1){
if ((l - r + 1) % 2 == 0) return 0;
else return 1;
}
// (a + (l - 1)为奇数的时候,公差为偶数的时候
if ((a + (l - 1) * k) % 2 == 1 && k % 2 == 0) return 1;
// (a + (l - 1)为偶数的时候,公差为奇数的时候
if ((a + (l - 1) * k) % 2 == 0 && k % 2 == 1) {
if ((l - r + 1) % 2 == 0) return 0;
else return -1;
}
return 0;
}
int main()
{
// 输入数据
cin >> a >> k >> q;
if (k == 0) return 0;
// 输入查询条件
for (int i = 0; i < q; i++){
cin >> l >> r;
arry[i] = funs(a, k, l, r);
}
// 输出数据
for (int i = q - 1; ~i; i--) cout << arry[q - 1 - i] << endl;
return 0;
}