专栏文章

题解:P14570 「LAOI-11」Metamorphosism

P14570题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min2ns3z
此快照首次捕获于
2025/12/01 19:34
3 个月前
此快照最后确认于
2025/12/01 19:34
3 个月前
查看原文

题意

给定正整数 nnmm,构造一个正整数序列 aa,使得序列中各数互不相同且都不超过 mm,同时满足:存在三个不同的下标 i,j,k[1,n]i, j, k \in [1, n],满足:
  • ai+aj=aka_i + a_j = a_k
  • ai×aj=aka_i \times a_j = a_k
  • aiaj=aka_i \oplus a_j = a_k
上述等式的任意一种。

思路

我们可以从数的奇偶性下手。
对于加法运算,显然存在奇奇得偶,奇偶得奇,偶偶得偶。
对于异或运算,由于奇数二进制结尾为 11,偶数二进制结尾为 00,所以奇偶性相同的两数异或后得到偶数,不同的异或后得到奇数。
因此,我们保证序列中全是奇数即可。因为两奇数无论相加还是相异或都会得到偶数,而序列中又不存在偶数,因此加法和异或这两个等式不会出现在序列中。
如果我们从 11 开始从小到大枚举所有奇数,那么显然有个问题。举个例子,对于数字 1515,它可以写作两个小于它的两个奇数相乘的结果,即 3×5=153 \times 5 = 15。因此从小到大枚举会造成很多麻烦。
所以,我们不妨从 mm 开始从大到小枚举所有奇数,这样就会保证在 nn 约束下 mm 可取值的范围内,不会出现两个奇数相乘得到序列中奇数的情况。

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 条评论,欢迎与作者交流。

正在加载评论...