結果

問題 No.2578 Jewelry Store
ユーザー suisen
提出日時 2023-01-09 22:05:49
言語 PyPy3
(7.3.15)
結果
RE  
実行時間 -
コード長 1,410 bytes
コンパイル時間 468 ms
コンパイル使用メモリ 82,252 KB
実行使用メモリ 73,736 KB
最終ジャッジ日時 2024-09-27 00:30:10
合計ジャッジ時間 10,544 ms
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other RE * 44 TLE * 1 -- * 9
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys

input = sys.stdin.readline

def prime_factors(m: int):
    pf = []
    if (m & 1) == 0:
        pf.append(2)
        while (m & 1) == 0:
            m >>= 1
    
    p = 3
    while p * p <= m:
        if m % p == 0:
            pf.append(p)
            while m % p == 0:
                m //= p
        p += 2
    
    if m != 1:
        pf.append(m)
    
    return pf

P = 998244353

t, m = map(int, input().split())
pf = prime_factors(m)
k = len(pf)

for _ in range(t):
    n = int(input())
    a = list(map(int, input().split()))
    w = list(map(int, input().split()))

    a2 = []
    w2 = []
    for i, (ai, wi) in enumerate(zip(a, w)):
        if m % ai == 0:
            a2.append(ai)
            w2.append(wi)
    a = a2
    w = w2

    zeta = [1] * (1 << k)

    for ai, wi in zip(a, w):
        t = 0
        for j, p in enumerate(pf):
            if (m // p) % ai:
                t |= 1 << j
        zeta[t] = zeta[t] * ((1 + wi) % P) % P
    
    block = 1
    while block < 1 << k:
        offset = 0
        while offset < 1 << k:
            for i in range(offset, offset + block):
                zeta[i + block] = zeta[i + block] * zeta[i] % P
            offset += 2 * block
        block <<= 1
    
    ans = 0
    for s in range(1 << k):
        if (bin(s).count('1') & 1):
            ans -= zeta[s]
        else:
            ans += zeta[s]

    print(ans % P, flush=False)
0