P8942 Digital Fortress 题解
唯一打出正解的题,还是得写篇东西纪念一下(主要是这场比赛是拉满比赛分的关键一场)。
题意
求构造一个长度为
Solution
这个题非常像 CF 的 A,构造的签到题。
首先有个贪心的结论,只要我们能够知道最大数的最小值,就能快速判断是否能构造。
考虑异或和持续变大是什么情况。每次异或和若想变大,显然需要将高位的某一位变成
考虑当刚好
题目要求递增,我们就令
由于异或和只是一个
判断无解也很简单,如果
但是注意这东西似乎不能用位运算,__lg 函数反向判断(考场用的 log2,hack 添加之后就丢精了),即
就喜欢 T1 放这种诈骗了又好像没有诈骗的题目 qwq。
#include<bits/stdc++.h>
using namespace std;
int T, n;
long long m;
int main(){
scanf("%d", &T);
while(T--){
scanf("%d%lld", &n, &m);
if(__lg(m) + 1 >= n){
printf("Yes\n");
for(int i=0;i<n;i++)
printf("%lld ", (1ll << i));
printf("\n");
}
else
printf("No\n");
}
return 0;
}