CF2072C

Problem

一个长度为 $n$ 的数组 $a$,满足以下条件:

${MEX}(S)$ 是最小的非负整数 $z$,使得 $z$ 不包含在集合 $S$ 中,并且所有 $0<y<z$ 都包含在 $S$ 中。

Solution

因为要让整个序列或的结果为 $x$,最好的是让整个序列都为 $x$。
然后看第二个条件,我们可以发现要在不影响结果为 $x$ 的情况下让 ${MEX}$ 最大。
怎么才能不影响结果,因为按位或的性质是某一位上只要有 1,那么最后结果一定有 1,所以可以由此找到最大的 ${MEX}$,并且不会有任何一位有影响结果的 1。

for(mex=0;mex<=n-1;mex++){
    if((mex&x)!=mex) break;
}

然后就输出 $1\rightarrow {{MEX}-1}$,多的就全部输出 $x$。

Code

#include<bits/stdc++.h>
using namespace std;
using LL=long long;
LL n,x,t,mex;
int main(){
    cin>>t;
    while(t--){
        LL tmp=0;
        cin>>n>>x;
        for(mex=0;mex<=n-1;mex++){
            if((mex&x)!=mex) break;
            tmp|=mex;
        }
        if(mex==n&&tmp!=x) mex--;
        for(int i=0;i<mex;i++){
            cout<<i<<' ';
        }
        for(int i=mex+1;i<=n;i++) cout<<x<<' ';
        cout<<endl;
    }
    return 0;
}