码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 862C - Mahmoud and Ehab and the xor

时间:2017-09-21 17:59:37      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:cout   ace   names   log   blog   logs   mic   col   const   

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

 

Codeforces 862C - Mahmoud and Ehab and the xor

标签:cout   ace   names   log   blog   logs   mic   col   const   

原文地址:http://www.cnblogs.com/widsom/p/7569421.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!