結果

問題 No.3024 全単射的
ユーザー lam6er
提出日時 2025-04-15 22:09:07
言語 PyPy3
(7.3.15)
結果
RE  
実行時間 -
コード長 2,120 bytes
コンパイル時間 455 ms
コンパイル使用メモリ 82,540 KB
実行使用メモリ 67,384 KB
最終ジャッジ日時 2025-04-15 22:10:35
合計ジャッジ時間 2,477 ms
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other RE * 22
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys

memo = {}

def compute_results(nums):
    key = tuple(sorted(nums))
    if key in memo:
        return memo[key]
    if len(nums) == 1:
        memo[key] = {nums[0]}
        return memo[key]
    res = set()
    for i in range(len(nums)):
        for j in range(i + 1, len(nums)):
            a, b = nums[i], nums[j]
            remaining = [nums[k] for k in range(len(nums)) if k != i and k != j]
            # a + b
            s = a + b
            new_nums = remaining + [s]
            res.update(compute_results(new_nums))
            # a - b
            s = a - b
            new_nums = remaining + [s]
            res.update(compute_results(new_nums))
            # b - a
            s = b - a
            new_nums = remaining + [s]
            res.update(compute_results(new_nums))
            # a * b
            s = a * b
            new_nums = remaining + [s]
            res.update(compute_results(new_nums))
            # a / b
            if b != 0:
                s = a / b
                new_nums = remaining + [s]
                res.add(s)
                res.update(compute_results(new_nums))
            # b / a
            if a != 0:
                s = b / a
                new_nums = remaining + [s]
                res.add(s)
                res.update(compute_results(new_nums))
    memo[key] = res
    return res

def main():
    n = int(sys.stdin.readline())
    A = list(map(int, sys.stdin.readline().split()))
    masks = []
    for mask in range(1, (1 << n) - 1):
        complement = ((1 << n) - 1) ^ mask
        if mask > complement:
            continue
        size = bin(mask).count('1')
        masks.append((size, mask))
    masks.sort()
    found = False
    for size, mask in masks:
        S = []
        T = []
        for k in range(n):
            if (mask >> k) & 1:
                S.append(A[k])
            else:
                T.append(A[k])
        res_S = compute_results(S)
        res_T = compute_results(T)
        if res_S & res_T:
            found = True
            break
    print("YES" if found else "NO")

if __name__ == "__main__":
    main()
0