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\):

  1. 当\(k != 1\), 如果\(a_i\)是偶数,或者b是偶数,则 \(a_i * b^{k-i}\) 必定是偶数,\(num\)不变。
  2. 当\(k == 1\)时,如果\(a_k\) 是偶数,\(num\)不变;
  3. 不满足上面条件,则 \(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;
}
上一篇:共享内存shared pool (5):详解一条SQL在library cache中解析


下一篇:【whk向】学习报告:对数运算初步