专栏文章
题解:P14570 「LAOI-11」Metamorphosism
P14570题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @min2ns3z
- 此快照首次捕获于
- 2025/12/01 19:34 3 个月前
- 此快照最后确认于
- 2025/12/01 19:34 3 个月前
题意
给定正整数 和 ,构造一个正整数序列 ,使得序列中各数互不相同且都不超过 ,同时满足:不存在三个不同的下标 ,满足:
上述等式的任意一种。
思路
我们可以从数的奇偶性下手。
对于加法运算,显然存在奇奇得偶,奇偶得奇,偶偶得偶。
对于异或运算,由于奇数二进制结尾为 ,偶数二进制结尾为 ,所以奇偶性相同的两数异或后得到偶数,不同的异或后得到奇数。
因此,我们保证序列中全是奇数即可。因为两奇数无论相加还是相异或都会得到偶数,而序列中又不存在偶数,因此加法和异或这两个等式不会出现在序列中。
如果我们从 开始从小到大枚举所有奇数,那么显然有个问题。举个例子,对于数字 ,它可以写作两个小于它的两个奇数相乘的结果,即 。因此从小到大枚举会造成很多麻烦。
所以,我们不妨从 开始从大到小枚举所有奇数,这样就会保证在 约束下 可取值的范围内,不会出现两个奇数相乘得到序列中奇数的情况。
Code
CPP#include <iostream>
#include <cstdio>
using namespace std;
int n, m, cnt = 0;
int main()
{
scanf("%d%d", &n, &m);
m = m - !(m & 1); // 由于从大到小枚举奇数,m 可能为偶数,所以起点要保证 m 是奇数。
for(int i = m;i >= 1;i = i - 2){
if(cnt == n) break; // 枚举够 n 个数。
printf("%d ", i);
cnt++;
}
return 0; // 结束 (。・ω・。)
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...