#include <iostream>

uint32_t firstPermutation(uint32_t p){
    return (1 << p) -1;
}

uint32_t lastPermutation(uint32_t p){
    return (0xFFFFFFFF >> p) ^ 0xFFFFFFFF;
}

uint32_t nextPermutation(uint32_t n){
    uint32_t t = (n | (n - 1)) + 1;
    return t | ((((t & -t) / (n & -n)) >> 1) - 1);
}


int sumIndices(uint32_t n){
    const int MultiplyDeBruijnBitPosition[32] = {
      0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
      31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
    };

    int sum = 0;
    do sum += MultiplyDeBruijnBitPosition[((uint32_t)((n & -n) * 0x077CB531U)) >> 27];
    while (n &= n-1);

    return sum;
}


int main(){
    uint32_t n,  // bit set
             k,  // sum of indicies
             p,  // current permutation
             lp; // final permutation

    std::cin >> k;
    std::cin >> n;

    p = firstPermutation(n);
    lp = lastPermutation(n);

    do {
        p = nextPermutation(p);
        if (sumIndices(p) == k){
            std::cout << "p:" << p << std::endl;
        }
    } while(p != lp);

    return 0;
}
