Codeforces 862C - Mahmoud and Ehab and the xor

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;
}

 

posted @ 2017-09-21 16:49  Wisdom+.+  阅读(233)  评论(0编辑  收藏  举报