没有牙齿的小怪兽

风的许多故事

【题解】 『FLA - I』冲云霄

Problem

题目传送门

Solution

Step1. 读题&分析

对于这道题目,我们需要根据给定的整数 nnmm 确定是否可以用相同的正整数 aa 组成一个长度为 mm 的序列,使得该序列所有元素的异或结果为 nn

具体来说,给定一个数列 aa 的所有元素都相同,记为 aa。那么该数列的异或结果是:

aaaa \oplus a \oplus \cdots \oplus a

其中 aa 出现了 mm 次。由于异或的一个重要性质是 xx=0x \oplus x = 0,因此对于一个相同的数 aa 异或 mm 次的结果为:

因此,我们可以得出结论:

  1. 如果 mm 是偶数,那么异或结果只能是 00。所以,如果 n=0n = 0 时输出 Yes,否则输出 No
  2. 如果 mm 是奇数,那么异或结果是 aa,因此只要 nn 可以作为数列中的元素(即 nn 是正整数),则输出 Yes,否则输出 No

Step2. 代码步骤

Step3. 时间复杂度计算

因为是直接使用结论做题目,所以单次计算复杂度为 Θ(1)\Theta(1),对于本题目的测试点是完全没问题的~~(有问题就出事了)~~。

Code

请遵守《洛谷社区规则》,重视学术诚信,不要当C玩以达成刷AC率的目的!

#include <bits/stdc++.h>
#define int long long
#define endl "\n"
#define fp(_a, _b, _c, _d) for(int _a = _b; _a <= _c; _a += _d)
#define fm(_a, _b, _c, _d) for(int _a = _b; _a <= _c; _a -= _d)
#define fin(_a, _b) for(int ss = 1; ss <= _a; ss ++ ) cin >> _b[ss];
#define fout(_a, _b, _c) for(int ss = 1; ss <= _a; ss ++ ) cout << _b[ss] << _c ;
using namespace std;

const int N = 1e7 + 10;
const int M = 2e3 + 5;

int t, n, m, k, a[N];

signed main()
{
    "toothless. #17";
    cin >> t;
    fp(ss, 1, t, 1)
    {
        cin >> n >> m ;
        if(m % 2 == 0)  // 如果  m  是偶数且  n  为  0 ,输出 Yes。否则输出 No。
        {
            if(n == 0)
            {
                cout << "Yes" << endl;
            }
            else
            {
                cout << "No" << endl;
            }
        }
        else  // 如果  m  是奇数且  n  为正整数,输出 Yes 。否则输出 No。
        {
            if(n > 0)
            {
                cout << "Yes" << endl;
            }
            else
            {
                cout << "No" << endl;
            }
        }
    }
    return 0;
}