AcWing 3800. 奇数还是偶数
Description
给定一个整数 \(n\),它可以被表示为一个 \(k\) 位的 \(b\) 进制数,如下所示:
\[n=a_1 \cdot b^{k−1}+a_2 \cdot b^{k−2}+\cdots+a_{k−1} \cdot b + a_k
\]
举例说明,如果 \(b=17,k=3,a=[11,15,7]\),那么 \(n=11⋅172+15⋅17+7=3179+255+7=3441\)。
请你判断 n 是奇数还是偶数。
Input
第一行包含整数 \(T\),表示共有 \(T\) 组测试数据。
每组数据第一行包含两个整数 \(b\) 和 \(k\)。
第二行包含 \(k\) 个整数 \(a_1, a_2,\cdots,a_k\)。
\(n\) 的 \(b\) 进制表示不含前导 0,也就是说只有 \(k=1\) 时,\(a_1\) 才有可能是 0。
Output
每组数据输出一行结果,\(n\) 是偶数则输出 even
,奇数则输出 odd
。
Data range
\(1≤T≤10\),
\(2≤b≤100\),
\(1≤k≤10^5\),
\(0≤a_i<b\),
Solution
从数据范围来看,直接模拟会爆int, 所以要转化。
由于\(n=a_1 \cdot b^{k−1}+a_2 \cdot b^{k−2}+\cdots+a_{k−1} \cdot b + a_k\),如果每一个相加项都知道奇偶性的话,那么\(n\)也就知道奇偶性了。
所以, 假设\(num\)为每位上奇数的数量,初始化\(num = 0\):
- 当\(k != 1\), 如果\(a_i\)是偶数,或者b是偶数,则 \(a_i * b^{k-i}\) 必定是偶数,\(num\)不变。
- 当\(k == 1\)时,如果\(a_k\) 是偶数,\(num\)不变;
- 不满足上面条件,则 \(a_i * b^{k-i}\) 必定是奇数, \(num ++\);
(写代码时,条件2、3可以合在一起)
code
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int q[N];
int main()
{
int T;
cin >> T;
while(T --)
{
int n, m;
cin >> n >> m;
int num = 0;
for(int i = 0; i < m; i++)
{
cin >> q[i];
if(q[i] % 2 == 0 || n % 2 == 0 && i != m - 1) num += 0;
else num += 1;
}
if(num % 2 == 0) cout << "even" << endl;
else cout << "odd" << endl;
}
return 0;
}