Vika and Price Tags (Codeforces 1848C)
Tags: Math, number theory

Vika came to her favorite cosmetics store "Golden Pear". She noticed that the prices of $$$n$$$ items have changed since her last visit.She decided to analyze how much the prices have changed and calculated the difference between the old and new prices for each of the $$$n$$$ items.Vika enjoyed calculating the price differences and decided to continue this process.Let the old prices be represented as an array of non-negative integers $$$a$$$, and the new prices as an array of non-negative integers $$$b$$$. Both arrays have the same length $$$n$$$.In one operation, Vika constructs a new array $$$c$$$ according to the following principle: $$$c_i = |a_i - b_i|$$$. Then, array $$$c$$$ renamed into array $$$b$$$, and array $$$b$$$ renamed into array $$$a$$$ at the same time, after which Vika repeats the operation with them.For example, if $$$a = [1, 2, 3, 4, 5, 6, 7]$$$; $$$b = [7, 6, 5, 4, 3, 2, 1]$$$, then $$$c = [6, 4, 2, 0, 2, 4, 6]$$$. Then, $$$a = [7, 6, 5, 4, 3, 2, 1]$$$; $$$b = [6, 4, 2, 0, 2, 4, 6]$$$.Vika decided to call a pair of arrays $$$a$$$, $$$b$$$ dull if after some number of such operations all elements of array $$$a$$$ become zeros.Output "YES" if the original pair of arrays is dull, and "NO" otherwise.

Input: Each test consists of multiple test cases. The first line contains a single integer $$$t$$$ ($$$1 \le t \le 10^4$$$) — the number of test cases. The description of the test cases follows.The first line of each test case contains a single integer $$$n$$$ ($$$1 \le n \le 10^5$$$) — the number of items whose prices have changed.The second line contains $$$n$$$ integers $$$a_1, a_2, \ldots, a_n$$$ ($$$0 \le a_i \le 10^9$$$) — the old prices of the items.The third line contains $$$n$$$ integers $$$b_1, b_2, \ldots, b_n$$$ ($$$0 \le b_i \le 10^9$$$) — the new prices of the items.It is guaranteed that the sum of $$$n$$$ over all test cases does not exceed $$$10^5$$$.

Output: For each test case, output "YES" if the pair of price arrays is dull, and "NO" otherwise.You can output each letter in any case (lowercase or uppercase). For example, the strings "yEs", "yes", "Yes", and "YES" will be accepted as a positive answer.

Note: In the first test case, the array $$$a$$$ is initially zero.In the second test case, after the first operation $$$a = [1, 2, 3], b = [0, 0, 0]$$$. After the second operation $$$a = [0, 0, 0], b = [1, 2, 3]$$$.In the third test case, it can be shown that the array $$$a$$$ will never become zero.

Sample Inputs:
9
4
0 0 0 0
1 2 3 4
3
1 2 3
1 2 3
2
1 2
2 1
6
100 23 53 11 56 32
1245 31 12 6 6 6
7
1 2 3 4 5 6 7
7 6 5 4 3 2 1
3
4 0 2
4 0 2
3
2 5 2
1 3 4
2
6 1
4 2
2
0 0
0 3

Sample Outputs:
YES
YES
NO
NO
YES
YES
NO
YES
YES

Solution (Python):
import sys
from math import gcd
from functools import reduce

def main():
    input = sys.stdin.readline
    for _ in range(int(input())):
        n = int(input())
        arr = list(map(int, input().split()))
        brr = list(map(int, input().split()))
        print('YES' if solve(n, arr, brr) else 'NO')

def solve(n, arr, brr):
    patterns = list(map(get_pattern, arr, brr))
    return reduce(int.__or__, patterns) != 7

def get_pattern(a, b):
    if a == b == 0:
        return 0
    elif a == 0:
        return 3
    elif b == 0:
        return 5
    elif a == b:
        return 6
    d = gcd(a, b)
    a //= d
    b //= d
    if a & 1 == 0 and b & 1 == 1:
        return 3
    elif a & 1 == 1 and b & 1 == 0:
        return 5
    elif a & 1 == 1 and b & 1 == 1:
        return 6
    else:
        raise ValueError('a and b cannot both be even')
if __name__ == '__main__':
    sys.exit(main())

Solution (Python):
t = int(input())
for i in range(t):
    n = int(input())
    aux1 = input()
    a = list(map(int, aux1.split()))
    aux2 = input()
    b = list(map(int, aux2.split()))
    r = 1
    for j in range(0, n):
        if a[j] != 0 or b[j] != 0:
            while a[j] % 2 == 0 and b[j] % 2 == 0:
                a[j] = a[j] // 2
                b[j] = b[j] // 2
            if a[j] % 2 == 0:
                m = 0
            elif b[j] % 2 == 0:
                m = 1
            else:
                m = 2
            break
    for k in range(j, n):
        if a[k] != 0 or b[k] != 0:
            while a[k] % 2 == 0 and b[k] % 2 == 0:
                a[k] = a[k] // 2
                b[k] = b[k] // 2
            if a[k] % 2 == 0:
                n = 0
            elif b[k] % 2 == 0:
                n = 1
            else:
                n = 2
            if n != m:
                r = 0
                break
    if r:
        print('YES')
    else:
        print('NO')

Solution (Python):
for __ in range(int(input())):
    n = int(input())
    a = list(map(int, input().split()))
    b = list(map(int, input().split()))
    c = set()
    for (i, j) in zip(a, b):
        if i == 0 and j == 0:
            continue
        elif i == 0:
            c.add(2)
            continue
        elif j == 0:
            c.add(0)
            continue
        elif i % 2 == 1 and j % 2 == 1:
            c.add(1)
            continue
        elif i % 2 == 0 and j % 2 == 1:
            c.add(2)
            continue
        elif i % 2 == 1 and j % 2 == 0:
            c.add(0)
            continue
        while i % 2 == 0 and j % 2 == 0 and (i != 0) and (j != 0):
            i //= 2
            j //= 2
        if i == 0 and j == 0:
            continue
        elif i == 0:
            c.add(2)
        elif j == 0:
            c.add(0)
        elif i % 2 == 1 and j % 2 == 1:
            c.add(1)
        elif i % 2 == 0 and j % 2 == 1:
            c.add(2)
        elif i % 2 == 1 and j % 2 == 0:
            c.add(0)
    if len(c) <= 1:
        print('YES')
    else:
        print('NO')