862C - Mahmoud and Ehab and the xor
思路:找两对异或后等于(1<<17-1)的数(相当于加起来等于1<<17-1),两个再异或一下就变成0了,0异或x等于x。所以只要把剩下的异或起来变成x就可以了。如果剩下来有3个,那么,这3个数可以是x^i^j,i,j。
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back const int N=1e7+5; bool vis[N]={false}; bool vs[105]={false}; vector<int>ans; vector<int>temp; int n,x; bool flag=false; void dfs(int s,int t,int n) { if(flag)return ; if(t==0) { if(!vs[n]) { for(int i=0;i<temp.size();i++) ans.pb(temp[i]),vis[temp[i]]=true; ans.pb(n),vis[n]=true; flag=true; } return ; } for(int i=s;i<20;i++) { temp.pb(i); vs[i]=true; if(i!=x)dfs(i+1,t-1,n^i); vs[i]=false; temp.pop_back(); } } int main() { ios::sync_with_stdio(false); cin.tie(0); int n,x; cin>>n>>x; if(n==2&&x==0) { cout<<"NO"<<endl; return 0; } int t=n%4,t1=n-t; if(t==2&&n!=2)t=6,t1-=4; if(t==0)t=4,t1-=4; vis[x]=true; dfs(0,t-1,x); for(int i=0;i<(1<<17);i++) { if(t1) { if((!vis[i])&&(!vis[131071-i])) { ans.pb(i); ans.pb(131071-i); vis[i]=vis[131071-i]=true; t1-=2; } } else break; } cout<<"YES"<<endl; for(int i=0;i<ans.size();i++) { cout<<ans[i]; if(i!=ans.size())cout<<' '; } cout<<endl; return 0; }