「题解」 『FLA - I』冲云霄

磅豆龙 融会贯通

Problem

题目传送门

Solution

Step1. 读题&分析

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

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


其中出现了次。由于异或的一个重要性质是,因此对于一个相同的数异或次的结果为:

  • 如果是偶数,结果是
  • 如果是奇数,结果是

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

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

Step2. 代码步骤

  • 输入:首先读取测试用例的数量。然后,对于每个测试用例,读取两个整数
  • 处理:根据的奇偶性判断结果:
    • 如果是偶数且,输出 Yes。否则输出 No
    • 如果是奇数且为正整数,输出 Yes。否则输出 No

Step3. 时间复杂度计算

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

Code

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

『FLA - I』冲云霄.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#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;
}
  • Title: 「题解」 『FLA - I』冲云霄
  • Author: 磅豆龙
  • Created at : 2024-08-03 08:35:17
  • Updated at : 2024-08-21 12:56:36
  • Link: https://blog.setbun.com/p/20240803.html
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments