結果

問題 No.2578 Jewelry Store
ユーザー suisensuisen
提出日時 2023-01-10 00:45:18
言語 PyPy3
(7.3.15)
結果
RE  
実行時間 -
コード長 1,442 bytes
コンパイル時間 3,903 ms
コンパイル使用メモリ 81,444 KB
実行使用メモリ 72,852 KB
最終ジャッジ日時 2023-12-05 23:30:20
合計ジャッジ時間 15,181 ms
ジャッジサーバーID
(参考情報)
judge13 / judge11
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 RE -
testcase_01 RE -
testcase_02 RE -
testcase_03 RE -
testcase_04 RE -
testcase_05 RE -
testcase_06 RE -
testcase_07 RE -
testcase_08 RE -
testcase_09 RE -
testcase_10 RE -
testcase_11 RE -
testcase_12 RE -
testcase_13 RE -
testcase_14 RE -
testcase_15 RE -
testcase_16 RE -
testcase_17 RE -
testcase_18 RE -
testcase_19 RE -
testcase_20 RE -
testcase_21 RE -
testcase_22 RE -
testcase_23 RE -
testcase_24 RE -
testcase_25 RE -
testcase_26 RE -
testcase_27 RE -
testcase_28 RE -
testcase_29 RE -
testcase_30 RE -
testcase_31 RE -
testcase_32 RE -
testcase_33 RE -
testcase_34 RE -
testcase_35 RE -
testcase_36 RE -
testcase_37 RE -
testcase_38 RE -
testcase_39 RE -
testcase_40 RE -
testcase_41 RE -
testcase_42 RE -
testcase_43 RE -
testcase_44 TLE -
testcase_45 -- -
testcase_46 -- -
testcase_47 -- -
testcase_48 -- -
testcase_49 -- -
testcase_50 -- -
testcase_51 -- -
testcase_52 -- -
testcase_53 -- -
権限があれば一括ダウンロードができます

ソースコード

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]
    if m == 1:
        ans -= 1

    print(ans % P, flush=False)
0