#include #include #include inline int dec (int l, int r, std::vector& v); inline bool check (int l, int r, std::vector& v, std::vector& gist); inline void gist_update(int l, int r, std::vector& v, std::vector& gist); void gist_init(int n, std::vector& gist); void v_init (int n, std::vector& gist, std::vector& v); void v_build (int n, std::vector& gist, std::vector& v); int main() { std::ios_base::sync_with_stdio(false); int n; std::cin >> n; int pow2n = std::pow(2, n); std::vector gist(2*pow2n, 0); gist_init(n, gist); std::vector v; v_init(n, gist, v); v_build(n, gist, v); for(int i = 0; i < v.size(); ++i) std::cout << v[i]; std::cout << std::endl; return 0; } inline int dec(int l, int r, std::vector& v) { int num = 0; for(int i = l; i <= r; ++i) num = 2*num + v[i]; return num; } void gist_init(int n, std::vector& gist) { int pow2n = std::pow(2, n); int k = 2; int jlim = 1; for(int i = 1; i <= n; ++i) { pow2n /= 2; jlim *= 2; for(int j = 0; j < jlim; ++j) gist[k++] = pow2n; } } void v_init(int n, std::vector& gist, std::vector& v) { for(int i = 0; i < n; ++i) v.push_back(0); int igist = 1; for(int i = 1; i <= n; ++i) { igist *= 2; // igist = pow(2, i) gist[igist] -= (n+1-i); } } void v_build(int n, std::vector& gist, std::vector& v) { int pow2n = std::pow(2, n); for(int i = 0; i < pow2n-n; ++i) { v.push_back(0); if( !check(v.size()-n, v.size()-1, v, gist) ) v[v.size()-1] = 1; else gist_update(v.size()-n, v.size()-1, v, gist); } for(int i = 1; i < n; ++i) v.push_back(0); } inline bool check(int l, int r, std::vector& v, std::vector& gist) { int pow2n = 1; int dec = 0; for(int i = r; i >= l; --i) { dec += pow2n * v[i]; //dec = dec(i, r, v) pow2n *= 2; // pow2n = pow(2, (r-i+1)) if(gist[pow2n + dec] == 0) return false; } return true; } inline void gist_update(int l, int r, std::vector& v, std::vector& gist) { int pow2n = 1; int dec = 0; for(int i = r; i >= l; --i) { dec += pow2n * v[i]; //dec = dec(i, r, v) pow2n *= 2; // pow2n = pow(2, (r-i+1)) --gist[pow2n + dec]; } }