#include<bits/stdc++.h>
using namespace std;
int n,a,b,sum;
void dfs(int x,int y,int ban){
    if(__builtin_popcount(ban^sum)==1){
        printf("%d %d ",y,x^y);
        return;
    }
    for(int i=0;i<n;i++)
        if((~(ban>>i)&1)&&(x>>i&1))
            for(int j=0;j<n;j++)
                if((~(ban>>j)&1)&&i!=j){
                    dfs(1<<j,y,ban|1<<i);
                    dfs(x^(1<<i)^(1<<j),y^(1<<i)^(1<<j),ban|1<<i);
                    return;
                }
}
/*dfs(x,y,ban)表示需要从状态0走到状态x,ban是一个长度为n的二进制串,其中第i位为1表示这一维已经不存在了,即若这个二进制串总共有p个0,则表示当前需要处理的是在p维空间下从0走到x这件事情。
划分的时候先找到某个二进制位满足x在这一位上为1(也就是代码里的i),然后在随便选一个在第i位上是0且有奇数个1的数,代码里为了方便我就直接选了某个2^j,然后递归构造0 -> 2^j -> 2^j+2^i -> x的路径就行了。
那个y是指表明接下来处理的所有数在输出时都要异或上y,这样在划分问题的时候可以比较方便地把子问题归为“从0出发走到x”这种形式。*/
int main(){
    scanf("%d%d%d",&n,&a,&b);
    sum=(1<<n)-1;
    if(__builtin_popcount(a^b)&1){
        printf("YES\n");
        dfs(a^b,a,0);
    }
    else
        printf("NO");
    return 0;
}
/*要从0走到AxorB,可以选出一个二进制位p满足AxorB在第p位上值为1,遍历二进制第p位为0的所有点组成的n−1维超立方体后,再去遍历二进制位第p位为1的所有点组成的n−1维超立方体。两个n−1维超立方体之间的连接点的选取是任意的,只需要满足起点终点二进制位不同的位数是奇数。*/

/*感谢租酥宇大佬的解答*/

Atcoder Grand Contest 031C(构造,思维,异或,DFS)的更多相关文章

  1. AtCoder Grand Contest 011D(思维,规律,异或)

    #include<bits/stdc++.h>using namespace std;char s[200007];int ans[200007];int main(){    int n ...

  2. 【AtCoder Grand Contest 007E】Shik and Travel [Dfs][二分答案]

    Shik and Travel Time Limit: 50 Sec  Memory Limit: 512 MB Description 给定一棵n个点的树,保证一个点出度为2/0. 遍历一遍,要求每 ...

  3. AtCoder Grand Contest 019 B - Reverse and Compare【思维】

    AtCoder Grand Contest 019 B - Reverse and Compare 题意:给定字符串,可以选定任意i.j且i<=j(当然i==j时没啥卵用),然后翻转i到j的字符 ...

  4. Atcoder Grand Contest 024 E - Sequence Growing Hard(dp+思维)

    题目传送门 典型的 Atcoder 风格的计数 dp. 题目可以转化为每次在序列中插入一个 \([1,k]\) 的数,共操作 \(n\) 次,满足后一个序列的字典序严格大于前一个序列,问有多少种操作序 ...

  5. AtCoder Grand Contest 012

    AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...

  6. AtCoder Grand Contest 031 简要题解

    AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...

  7. AtCoder Grand Contest 004

    AtCoder Grand Contest 004 A - Divide a Cuboid 翻译 给定一个\(A*B*C\)的立方体,现在要把它分成两个立方体,求出他们的最小体积差. 题解 如果有一条 ...

  8. AtCoder Grand Contest 010

    AtCoder Grand Contest 010 A - Addition 翻译 黑板上写了\(n\)个正整数,每次会擦去两个奇偶性相同的数,然后把他们的和写会到黑板上,问最终能否只剩下一个数. 题 ...

  9. AtCoder Grand Contest 008

    AtCoder Grand Contest 008 A - Simple Calculator 翻译 有一个计算器,上面有一个显示按钮和两个其他的按钮.初始时,计算器上显示的数字是\(x\),现在想把 ...

随机推荐

  1. MariaDB 脚本

    研究MariaDB, 需要mock up一些假数据: 生成n个长度整型数的函数rand_num: CREATE DEFINER=`root`@`localhost` FUNCTION `rand_nu ...

  2. 第十三章 MySQL用户管理(待续)

    ·············

  3. VMWARE 虚拟机新增硬盘,格式化分区,并挂载

    VMWARE 虚拟机新增 硬盘 并挂载 一台虚拟机上安装ORACLE12c 需要分一块硬盘挂载数据文件 日志文件 以及归档文件 1. 关闭虚拟机 2. 编辑虚拟机设置 选择[编辑虚拟机设置]并打开,将 ...

  4. linux加入windows域之完美方案

    运行setup工具 认证配置 选择: “use winbind” “use kerberos” “use winbind authertication” 改为: 删除admin server 其余的改 ...

  5. 170318 11:44:26 [ERROR] Can't start server: can't create PID file: No space left on device

    数据库挂了.打开远程,进了系统,service mysqld stop 失败.service mysqld start等了好大一会,提示Timeout error occurred trying to ...

  6. Jmeter调度器配置

    Jmeter的线程组设置里有一个调配器设置,用于设置该线程组下脚本执行的开始时间.结束时间.持续时间及启动延迟时间.当需要半夜执行性能测试时会用到这个功能. ps:设置调度器配置,需要将前面的循环次数 ...

  7. 利用JDBC连接数据库(MySQL)

    1 在eclipse中创建一个maven项目(在Java模式下,不要在JavaEE模式下) 1.1 file  -->> new  -->> project 2 下载数据库驱动 ...

  8. 第七课 ROS的空间描述和变换

    在命令行工具中也有一个与transformcaster相类似的工具叫做static_transform_publisher,它能够接受命令行参数来接受位置信息.旋转信息.父框架.子框架以及周期信息,通 ...

  9. JavaScript跨域调用基于JSON的RESTful API

    1. 基本术语 AJAX(Asynchronous JavaScript And XML,异步JavaScript和XML):AJAX是一种用于创建快速动态网页的技术,通过在后台与服务器进行少量数据交 ...

  10. Session.Abandon-Session.Clear-Session.RemoveAll

    System.Web.UI.Page.Session属性和System.Web.HttpContext.Session属性 都是System.Web.SessionState.HttpSessionS ...