Problem:
Score : 800 points

Problem Statement

You are given integers N,\ A and B.
Determine if there exists a permutation (P_0,\ P_1,\ ...\ P_{2^N-1}) of (0,\ 1,\ ...\ 2^N-1) that satisfies all of the following conditions, and create one such permutation if it exists.

P_0=A

P_{2^N-1}=B

For all 0 \leq i < 2^N-1, the binary representations of P_i and P_{i+1} differ by exactly one bit.

Constraints

1 \leq N \leq 17

0 \leq A \leq 2^N-1

0 \leq B \leq 2^N-1

A \neq B

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N A B

Output

If there is no permutation that satisfies the conditions, print NO.

If there is such a permutation, print YES in the first line.
Then, print (P_0,\ P_1,\ ...\ P_{2^N-1}) in the second line, with spaces in between.
If there are multiple solutions, any of them is accepted.

Sample Input 1

2 1 3

Sample Output 1

YES
1 0 2 3

The binary representation of P=(1,0,2,3) is (01,00,10,11), where any two adjacent elements differ by exactly one bit.

Sample Input 2

3 2 1

Sample Output 2

NO

Solution in C# (Mono 4.6.2.0) (judge verdict: Runtime Error)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using static System.Console;
using static System.Math;

namespace AtTest.AGC_031
{
    class C
    {
        static void Main(string[] args)
        {
            Method(args);
            ReadLine();
        }

        static void Method(string[] args)
        {
            int[] nab = ReadInts();
            int n = nab[0];
            int a = nab[1];
            int b = nab[2];
            int delta = 0;
            int div = 1;
            for(int i = 0; i < n; i++)
            {
                if ((a & div) != (b & div)) delta++;
                div *= 2;
            }
            if (delta % 2 ==0)
            {
                WriteLine("NO");
                return;
            }
            WriteLine("YES");
            var dict = new Dictionary<int, bool>();
            dict.Add(a,true);
            dict.Add(b,true);
            int all = 1 << n;
            int val = a;
            int[] res = new int[1 << n];
            res[0] = Min(a, b);
            res[(1 << n) - 1] = Max(a, b);
            bool down = true;
            for(int i = 1; i < all-1; i++)
            {
                int k = 1;
                for (int j = 0; j < n; j++)
                {
                    if (down || val > res[1 << n - 1])
                    {
                        if ((val & k) == 1 && !dict.ContainsKey(val - k))
                        {
                            val -= k;
                            break;
                        }
                    }
                    else
                    {
                        if ((val & k) == 0 && !dict.ContainsKey(val + k))
                        {
                            val += k;
                            break;
                        }
                    }
                    k *= 2;
                }
                res[i] = val;
                dict.Add(val, true);
                if (val == 0) down = false;
            }
            if (b < a) Array.Reverse(res);
            for(int i = 0; i < 1 << n; i++)
            {
                Write(res[i]);
                if (i + 1 < 1 << n) Write(" ");
            }
            WriteLine();
        }

        private static string Read() { return ReadLine(); }
        private static int ReadInt() { return int.Parse(Read()); }
        private static long ReadLong() { return long.Parse(Read()); }
        private static double ReadDouble() { return double.Parse(Read()); }
        private static int[] ReadInts() { return Array.ConvertAll(Read().Split(), int.Parse); }
        private static long[] ReadLongs() { return Array.ConvertAll(Read().Split(), long.Parse); }
        private static double[] ReadDoubles() { return Array.ConvertAll(Read().Split(), double.Parse); }
    }
}