Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma GCC optimization "O2"
- #pragma GCC optimization "unroll-loop"
- #pragma GCC target ("avx2")
- #include <bits/stdc++.h>
- #define ll int
- #define ld long double
- #define fs first
- #define sc second
- using namespace std;
- const ll N = 1e6 + 69;
- const ll Log2 = 20;
- const ll inf = 1e9 + 7;
- typedef pair<ll,ll> LL;
- ll n,x,cnt[N],dp1[N][21],dp2[N][21],dp3[N][21];
- bool bit(ll x,ll i){
- return (x >> i) & 1;
- }
- ll f1(ll mask,ll i){
- if (mask >= N) return 0;
- if (i < 0) return cnt[mask];
- if (dp1[mask][i] != -1) return dp1[mask][i];
- ll ans = f1(mask,i - 1);
- if (bit(mask,i)) ans += f1(mask ^ (1 << i),i - 1);
- return dp1[mask][i] = ans;
- }
- ll f2(ll mask,ll i){
- if (mask >= N) return 0;
- if (i < 0) return cnt[mask];
- if (dp2[mask][i] != -1) return dp2[mask][i];
- ll ans = f2(mask,i - 1);
- if (!bit(mask,i)) ans += f2(mask ^ (1 << i),i - 1);
- return dp2[mask][i] = ans;
- }
- ll f3(ll mask,ll i){
- if (mask >= N) return 0;
- if (i < 0) return cnt[mask];
- if (dp3[mask][i] != -1) return dp3[mask][i];
- ll ans = f3(mask ^ (1 << i),i - 1);
- if (!bit(mask,i)) ans += f3(mask,i - 1);
- return dp3[mask][i] = ans;
- }
- ll a[N];
- int main(){
- ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0);
- #define task "bruh"
- if (fopen(task".inp", "r")){
- freopen(task".inp", "r", stdin);
- freopen(task".out", "w", stdout);
- }
- cin>>n;
- for (ll i = 1;i <= n;i++) cin>>x,cnt[x]++,a[i] = x;
- memset(dp1,-1,sizeof(dp1)); memset(dp2,-1,sizeof(dp2)); memset(dp3,-1,sizeof(dp3));
- for (ll i = 1;i <= n;i++){
- cout<<f1(a[i],20)<<" "<<f2(a[i],20)<<" "<<n - f3(a[i],20)<<"\n";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment