#include "bits/stdc++.h" using namespace std; #define dbg(var) cout<<#var<<"="<<var<<" " #define nl cout<<"\n" #define fr(i,n) for(int i=0;i<n;i++) #define rep(i,a,n) for(int i=a;i<=n;i++) #define fast ios::sync_with_stdio(false);cin.tie(0); #define vi vector<int> #define vvi vector<vi> #define pb push_back #define fa(v) for(auto &i:v) #define all(v) v.begin(),v.end() #define sz(v) (int)(v.size()) //#define int long long const int N = (1<<20) + 10; int a[N],b[N],c[N]; void transform(int *from, int *to) { if(to - from == 1) return; int *mid = from + (to - from) / 2; transform(from, mid); transform(mid, to); for(int i = 0; i < mid - from; i++) *(mid + i) += *(from + i); } void inverse(int *from, int *to) { if(to - from == 1) return; int *mid = from + (to - from) / 2; inverse(from, mid); inverse(mid, to); for(int i = 0; i < mid - from; i++) *(mid + i) -= *(from + i); } int get_brute(int n){ pair<int,int> ans{-1,-1}; for(int mask = 0; mask < (1 << n); mask++){ int OR = 0,cnt = 0; for(int j=0; j < n; j++){ if((mask >> j) & 1){ cnt++; OR |= b[j]; } } ans = max(ans, {OR,-cnt}); } return -ans.second; } auto random_address = [] { char *p = new char; delete p; return (uint64_t) p; }; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count() * (random_address() | 1)); int32_t main() { int mx = (1 << 20); int n,x, OR = 0; cin >> n; for(int i=0; i<n; i++) { // cin >> x; x = rng() % mx; a[x] = 1,c[x] =1, OR |= x,b[i] = x; } transform(a, a+mx);//// multiplier int ans = 1; int brute = get_brute(n); while(!c[OR]){ ans++; transform(c,c+mx); for(int i=0; i < mx; i++) c[i] = a[i] * c[i]; inverse(c,c+mx); } if(ans!= brute){ for(int i=0; i< n; i++) cout << b[i] << " ";nl;} cout << "norml ----> " << ans << "\n"; cout << "brute ----> " << brute << "\n"; }