結果
| 問題 |
No.2959 Dolls' Tea Party
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 16:35:48 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,384 bytes |
| コンパイル時間 | 141 ms |
| コンパイル使用メモリ | 82,592 KB |
| 実行使用メモリ | 146,204 KB |
| 最終ジャッジ日時 | 2025-06-12 16:35:57 |
| 合計ジャッジ時間 | 6,303 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 5 TLE * 1 -- * 27 |
ソースコード
import sys
MOD = 998244353
def input():
return sys.stdin.read()
def factorize(n):
factors = {}
i = 2
while i * i <= n:
while n % i == 0:
factors[i] = factors.get(i, 0) + 1
n //= i
i += 1
if n > 1:
factors[n] = 1
return factors
def get_divisors(factors):
divisors = [1]
for p, exp in factors.items():
temp = []
for e in range(1, exp + 1):
pe = p ** e
for d in divisors:
temp.append(d * pe)
divisors += temp
return sorted(list(set(divisors)))
def compute_phi(divisors, factors):
phi = {}
for d in divisors:
val = d
for p in factors:
if d % p == 0:
val = val // p * (p - 1)
phi[d] = val
return phi
def multiply_polynomials(a, b, m):
res = [0] * (m + 1)
for i in range(len(a)):
if a[i] == 0:
continue
for j in range(len(b)):
if i + j > m:
continue
res[i + j] = (res[i + j] + a[i] * b[j]) % MOD
return res
def pow_poly(p, exponent, m):
result = [1] + [0] * m
current = p.copy()
while exponent > 0:
if exponent % 2 == 1:
result = multiply_polynomials(result, current, m)
current = multiply_polynomials(current, current, m)
exponent = exponent // 2
return result
def main():
data = input().split()
N = int(data[0])
K = int(data[1])
A = list(map(int, data[2:2+N]))
if K == 0:
print(0)
return
factors = factorize(K)
divisors = get_divisors(factors)
divisors = [d for d in divisors if K % d == 0]
divisors = sorted(divisors)
phi = compute_phi(divisors, factors)
max_m = K
if K > 0:
max_m = max(K // min(divisors), 1)
else:
max_m = 1
fact = [1] * (max_m + 1)
for i in range(1, max_m + 1):
fact[i] = fact[i-1] * i % MOD
inv_fact = [1] * (max_m + 1)
inv_fact[max_m] = pow(fact[max_m], MOD-2, MOD)
for i in range(max_m-1, -1, -1):
inv_fact[i] = inv_fact[i+1] * (i+1) % MOD
total = 0
for d in divisors:
m = K // d
if m == 0:
continue
cnt_c = {}
T_count = 0
for a in A:
ci = a // d
ci = min(ci, m)
if ci >= m:
T_count += 1
else:
if ci not in cnt_c:
cnt_c[ci] = 0
cnt_c[ci] += 1
P = [0] * (m + 1)
P[0] = 1
for c, count in cnt_c.items():
if c == 0:
continue
max_x = min(c, m)
G = [inv_fact[x] for x in range(max_x + 1)]
G_power = pow_poly(G, count, m)
P = multiply_polynomials(P, G_power, m)
k = T_count
pow_k = [1] * (m + 1)
for x in range(1, m + 1):
pow_k[x] = pow_k[x-1] * k % MOD
Q = [pow_k[x] * inv_fact[x] % MOD for x in range(m + 1)]
final = multiply_polynomials(P, Q, m)
coeff = final[m] if m <= len(final)-1 else 0
f = coeff * fact[m] % MOD
total = (total + phi[d] * f) % MOD
inv_K = pow(K, MOD-2, MOD)
ans = total * inv_K % MOD
print(ans)
if __name__ == "__main__":
main()
gew1fw