Equate Multisets (Codeforces 1702F)
Tags: Greedy, number theory

Multiset —is a set of numbers in which there can be equal elements, and the order of the numbers does not matter. Two multisets are equal when each value occurs the same number of times. For example, the multisets $$$\{2,2,4\}$$$ and $$$\{2,4,2\}$$$ are equal, but the multisets $$$\{1,2,2\}$$$ and $$$\{1,1,2\}$$$ — are not.You are given two multisets $$$a$$$ and $$$b$$$, each consisting of $$$n$$$ integers.In a single operation, any element of the $$$b$$$ multiset can be doubled or halved (rounded down). In other words, you have one of the following operations available for an element $$$x$$$ of the $$$b$$$ multiset:   replace $$$x$$$ with $$$x \cdot 2$$$,  or replace $$$x$$$ with $$$\lfloor \frac{x}{2} \rfloor$$$ (round down).  Note that you cannot change the elements of the $$$a$$$ multiset.See if you can make the multiset $$$b$$$ become equal to the multiset $$$a$$$ in an arbitrary number of operations (maybe $$$0$$$).For example, if $$$n = 4$$$, $$$a = \{4, 24, 5, 2\}$$$, $$$b = \{4, 1, 6, 11\}$$$, then the answer is yes. We can proceed as follows:   Replace $$$1$$$ with $$$1 \cdot 2 = 2$$$. We get $$$b = \{4, 2, 6, 11\}$$$.  Replace $$$11$$$ with $$$\lfloor \frac{11}{2} \rfloor = 5$$$. We get $$$b = \{4, 2, 6, 5\}$$$.  Replace $$$6$$$ with $$$6 \cdot 2 = 12$$$. We get $$$b = \{4, 2, 12, 5\}$$$.  Replace $$$12$$$ with $$$12 \cdot 2 = 24$$$. We get $$$b = \{4, 2, 24, 5\}$$$.  Got equal multisets $$$a = \{4, 24, 5, 2\}$$$ and $$$b = \{4, 2, 24, 5\}$$$. 

Input: The first line of input data contains a single integer $$$t$$$ ($$$1 \le t \le 10^4$$$) —the number of test cases.Each test case consists of three lines.The first line of the test case contains an integer $$$n$$$ ($$$1 \le n \le 2 \cdot 10^5$$$) —the number of elements in the multisets $$$a$$$ and $$$b$$$.The second line gives $$$n$$$ integers: $$$a_1, a_2, \dots, a_n$$$ ($$$1 \le a_1 \le a_2 \le \dots \le a_n \le 10^9$$$) —the elements of the multiset $$$a$$$. Note that the elements may be equal.The third line contains $$$n$$$ integers: $$$b_1, b_2, \dots, b_n$$$ ($$$1 \le b_1 \le b_2 \le \dots \le b_n \le 10^9$$$) — elements of the multiset $$$b$$$. Note that the elements may be equal.It is guaranteed that the sum of $$$n$$$ values over all test cases does not exceed $$$2 \cdot 10^5$$$.

Output: For each test case, print on a separate line:  YES if you can make the multiset $$$b$$$ become equal to $$$a$$$,  NO otherwise. You can output YES and NO in any case (for example, strings yEs, yes, Yes and YES will be recognized as positive answer).

Note: The first example is explained in the statement.In the second example, it is impossible to get the value $$$31$$$ from the numbers of the multiset $$$b$$$ by available operations.In the third example, we can proceed as follows:   Replace $$$2$$$ with $$$2 \cdot 2 = 4$$$. We get $$$b = \{4, 14, 14, 26, 42\}$$$.  Replace $$$14$$$ with $$$\lfloor \frac{14}{2} \rfloor = 7$$$. We get $$$b = \{4, 7, 14, 26, 42\}$$$.  Replace $$$26$$$ with $$$\lfloor \frac{26}{2} \rfloor = 13$$$. We get $$$b = \{4, 7, 14, 13, 42\}$$$.  Replace $$$42$$$ with $$$\lfloor \frac{42}{2} \rfloor = 21$$$. We get $$$b = \{4, 7, 14, 13, 21\}$$$.  Replace $$$21$$$ with $$$\lfloor \frac{21}{2} \rfloor = 10$$$. We get $$$b = \{4, 7, 14, 13, 10\}$$$.  Got equal multisets $$$a = \{4, 7, 10, 13, 14\}$$$ and $$$b = \{4, 7, 14, 13, 10\}$$$.  

Sample Inputs:
5
4
2 4 5 24
1 4 6 11
3
1 4 17
4 5 31
5
4 7 10 13 14
2 14 14 26 42
5
2 2 4 4 4
28 46 62 71 98
6
1 2 10 16 64 80
20 43 60 74 85 99

Sample Outputs:
YES
NO
YES
YES
YES

Solution (Python):
import collections
x = int(input())

def shr(a):
    while a % 2 == 0:
        a //= 2
    return a

def cal(n, ts, tt):
    d1 = collections.defaultdict(int)
    d2 = collections.defaultdict(int)
    for i in range(n):
        d1[shr(ts[i])] += 1
        d2[shr(tt[i])] += 1
    for i in d2.keys():
        t = d2[i]
        while i > 0:
            if i in d1:
                if t > d1[i]:
                    t -= d1[i]
                    del d1[i]
                elif t == d1[i]:
                    del d1[i]
                    t = 0
                    break
                else:
                    d1[i] -= t
                    t = 0
                    break
            i //= 2
        if t > 0:
            return False
    return True
for jj in range(x):
    n = int(input())
    ts = [int(i) for i in input().split(' ')]
    tt = [int(i) for i in input().split(' ')]
    if cal(n, ts, tt):
        print('YES')
    else:
        print('NO')

Solution (Python):
from functools import lru_cache

@lru_cache(None)
def get_odd(x):
    while x % 2 == 0:
        x //= 2
    return x
t = int(input())
for _ in range(t):
    n = int(input())
    a = list(map(int, input().split()))
    b = list(map(int, input().split()))
    numbers = {}
    for x in a:
        numbers[get_odd(x)] = numbers.get(get_odd(x), 0) + 1
    for x in b:
        while x > 0 and x not in numbers:
            x //= 2
        if x in numbers:
            numbers[x] -= 1
            if numbers[x] == 0:
                numbers.pop(x)
    print('YES' if not len(numbers) else 'NO')

Solution (Python):
from collections import defaultdict

def solve():
    n = int(input())
    a = list(map(int, input().split()))
    b = list(map(int, input().split()))
    a_f = defaultdict(int)
    for i in a:
        while i & 1 == 0:
            i //= 2
        a_f[i] += 1
    check = True
    for i in b:
        while i >= 1:
            if a_f[i] > 0:
                a_f[i] -= 1
                break
            i //= 2
        else:
            check = False
            break
    return 'YES' if check else 'NO'
t = int(input())
for _ in range(t):
    ans = solve()
    print(ans)