Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- using ll = long long;
- using ld = long double;
- using ull = unsigned long long;
- using pii = pair<int, int>;
- using pll = pair<ll, ll>;
- using pld = pair<ld, ld>;
- #define fi first
- #define se second
- #define left BAO
- #define right ANH
- #define pb push_back
- #define pf push_front
- #define mp make_pair
- #define ins insert
- #define btpc __builtin_popcount
- #define btclz __builtin_clz
- #define sz(x) (int)(x.size());
- #define all(x) x.begin(), x.end()
- #define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
- mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
- int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1};
- int d8x[8] = {0, 1, 1, 1, 0, -1, -1, -1};
- int d8y[8] = {1, 1, 0, -1, -1, -1, 0, 1};
- template<class X, class Y>
- bool minimize(X &x, const Y &y) {
- if (x > y)
- {
- x = y;
- return true;
- }
- return false;
- }
- template<class X, class Y>
- bool maximize(X &x, const Y &y) {
- if (x < y)
- {
- x = y;
- return true;
- }
- return false;
- }
- const int MOD = 1e9 + 7; //998244353
- template<class X, class Y>
- void add(X &x, const Y &y) {
- x = (x + y);
- if(x >= MOD) x -= MOD;
- }
- template<class X, class Y>
- void sub(X &x, const Y &y) {
- x = (x - y);
- if(x < 0) x += MOD;
- }
- /* Author : Le Ngoc Bao Anh, 12A5, LQD High School for Gifted Student*/
- const ll INF = 1e9;
- const int N = (1 << 20) + 10;
- vector<int> path;
- vector<int> adj[N];
- bool visited[N], ok[N], used[N];
- int deg[N];
- int n, k;
- void dfs(int u) {
- visited[u] = true;
- path.pb(u);
- int nxt = 0, p = INF;
- for(int i = 0; i < n; i++) {
- int v = u ^ (1 << i);
- if(ok[v]) --deg[v];
- }
- for(int i = 0; i < n; i++) {
- int v = u ^ (1 << i);
- if(ok[v] && !visited[v]) {
- if(!nxt) {
- nxt = v;
- p = deg[v];
- }
- else {
- int c = deg[v];
- if(c) {
- if(!p || minimize(p, c)) {
- p = c;
- nxt = v;
- }
- }
- }
- }
- }
- if(nxt) dfs(nxt);
- }
- void BaoJiaoPisu() {
- cin >> n >> k;
- vector<int> node;
- for(int msk = 0; msk < (1 << n); msk++) {
- int cnt = btpc(msk);
- if(cnt == k || (cnt == k + 1)) node.pb(msk), ok[msk] = true;
- }
- for(auto u : node) {
- for(int i = 0; i < n; i++) {
- int v = u ^ (1 << i);
- if(ok[v]) ++deg[u];
- }
- }
- vector<int> ans;
- int cnt = 0;
- while(clock() <= 300ll * CLOCKS_PER_SEC) {
- if(cnt == node.size()) break;
- int u = rng() % (node.size() - cnt) + 1; ++cnt;
- int root = 0;
- for(int i = 0; i < node.size(); i++) {
- if(used[i]) continue; u--;
- if(!u) {
- root = node[i];
- used[i] = true;
- break;
- }
- }
- path.clear();
- dfs(root);
- if(path.size() > ans.size()) ans = path;
- for(auto u : path) {
- visited[u] = false;
- for(int i = 0; i < n; i++) {
- int v = u ^ (1 << i);
- if(ok[v]) ++deg[v];
- }
- }
- }
- cout << ans.size() << '\n';
- for(auto u : ans) {
- for(int i = 0; i < n; i++) {
- cout << (u >> i & 1);
- }
- cout << '\n';
- }
- }
- int main()
- {
- ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #else
- //online
- #endif
- int tc = 1, ddd = 0;
- // cin >> tc;
- while(tc--) {
- //ddd++;
- //cout << "Case #" << ddd << ": ";
- BaoJiaoPisu();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement