1864E - Guess Game - CodeForces Solution


bitmasks constructive algorithms data structures games math strings trees

Please click on ads to support us..

Python Code:

'''
CF 1864E
For each a, consider prefix of a's bits matching
prefix of b's bits and then having a difference in bit.
'''

class Node:
    def __init__(self):
        self.L = None
        self.R = None
        self.subtree_cnts = 0

def main():
    
    mod = 998244353

    t = int(input())
    allans = []
    for _ in range(t):
        n = int(input())
        s = readIntArr()

        trie_address = [-1, -1]          subtree_cnts = [0, 0]
        for v in s:
            u = 0
            for i in range(29, -1, -1):
                if (v & (1 << i)) == 0:
                    if trie_address[u] == -1:
                        trie_address.extend([-1, -1])
                        trie_address[u] = len(trie_address) - 2
                        subtree_cnts.extend([0, 0])
                    u = trie_address[u]
                else:
                    if trie_address[u + 1] == -1:
                        trie_address.extend([-1, -1])
                        trie_address[u + 1] = len(trie_address) - 2
                        subtree_cnts.extend([0, 0])
                    u = trie_address[u + 1]
                subtree_cnts[u] += 1
        
        ans = 0
        for v in s:
            a_turn = True
            n_turns = 1
            u = 0
            for i in range(29, -1, -1):
                if (v & (1 << i)) == 0:
                    if trie_address[u + 1] != -1:                          if a_turn:
                            ans += (n_turns * subtree_cnts[trie_address[u + 1]]) % mod
                            ans %= mod
                        else:
                            ans += ((n_turns + 1) * subtree_cnts[trie_address[u + 1]]) % mod
                            ans %= mod
                    u = trie_address[u]
                else:
                    if trie_address[u] != -1:                          if a_turn:
                            ans += ((n_turns + 1) * subtree_cnts[trie_address[u]]) % mod
                            ans %= mod
                        else:
                            ans += (n_turns * subtree_cnts[trie_address[u]]) % mod
                            ans %= mod
                    a_turn = not a_turn
                    n_turns += 1
                    u = trie_address[u + 1]
                                    ans += (n_turns * subtree_cnts[u]) % mod
            ans %= mod
        denominator = (n * n) % mod
        ans = (ans * pow(denominator, mod - 2, mod)) % mod
        allans.append(ans)
    multiLineArrayPrint(allans)

    return

import sys
input=sys.stdin.buffer.readline  
def oneLineArrayPrint(arr):
    print(' '.join([str(x) for x in arr]))
def multiLineArrayPrint(arr):
    print('\n'.join([str(x) for x in arr]))
def multiLineArrayOfArraysPrint(arr):
    print('\n'.join([' '.join([str(x) for x in y]) for y in arr]))
 
def readIntArr():
    return [int(x) for x in input().split()]
 
def makeArr(defaultValFactory,dimensionArr):     dv=defaultValFactory;da=dimensionArr
    if len(da)==1:return [dv() for _ in range(da[0])]
    else:return [makeArr(dv,da[1:]) for _ in range(da[0])]
 
def queryInteractive(a, b):
    print('? {} {}'.format(a, b))
    sys.stdout.flush()
    return int(input())
 
def answerInteractive(ans):
    print('! {}'.format(ans))
    sys.stdout.flush()
 
inf=float('inf')
 
from math import gcd,floor,ceil
import math
 
for _abc in range(1):
    main()

C++ Code:

#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while(t){
    t--;
    long long n, i, j, r, m, ans=0;
    cin >> n;
    long long s[n];
    for(i=0; i<n; i++){
        cin >> s[i];
    }
    sort(s, s+n);
    bool a[n][31];
    for(i=0; i<n; i++){
        a[i][0]=0;
    }
    for(i=0; i<n; i++){
        for(j=1; j<=30; j++){
            if(s[i]%2==1){
                a[i][j]=1;
            }
            else{
                a[i][j]=0;
            }
            s[i]/=2;
        }
    }
    long long b[31];
    for(i=0; i<=30; i++){
        b[i]=0;
    }
    for(i=0; i<n; i++){
        a[i][0]=1;
        for(j=30; j>-1; j--){
            if(a[i][j]!=a[i-1][j]){
                break;
            }
        }
        r=30-j;
        for(j=0; j<=30; j++){
            if(j>r){
                b[r]+=b[j];
                b[j]=0;
            }
        }
        b[30]++;
        r=0;
        for(j=0; j<=30; j++){
          if(j==30){
            ans=(ans+(2*b[30]-1)*(r+1))%mod;
            continue;
          }
          ans=(ans+(2*r+3)*b[j])%mod;
          if(a[i][30-j]){
            r++;
          }
        }
        a[i][0]=0;
    }
    for(i=0; i<n; i++){
        if((i*mod+1)%n==0){
            m=(i*mod+1)/n;
            m=m*m;
        }
    }
    ans=ans%mod;
    m=m%mod;
    ans=(ans*m)%mod;
    cout << ans << "\n";
}
}


Comments

Submit
0 Comments
More Questions

1245C - Constanze's Machine
1005A - Tanya and Stairways
1663F - In Every Generation
1108B - Divisors of Two Integers
1175A - From Hero to Zero
1141A - Game 23
1401B - Ternary Sequence
598A - Tricky Sum
519A - A and B and Chess
725B - Food on the Plane
154B - Colliders
127B - Canvas Frames
107B - Basketball Team
245A - System Administrator
698A - Vacations
1216B - Shooting
368B - Sereja and Suffixes
1665C - Tree Infection
1665D - GCD Guess
29A - Spit Problem
1097B - Petr and a Combination Lock
92A - Chips
1665B - Array Cloning Technique
1665A - GCD vs LCM
118D - Caesar's Legions
1598A - Computer Game
1605A - AM Deviation
1461A - String Generation
1585B - Array Eversion
1661C - Water the Trees