結果
問題 |
No.2959 Dolls' Tea Party
|
ユーザー |
![]() |
提出日時 | 2025-06-12 16:41:31 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,384 bytes |
コンパイル時間 | 404 ms |
コンパイル使用メモリ | 82,524 KB |
実行使用メモリ | 146,340 KB |
最終ジャッジ日時 | 2025-06-12 16:41:38 |
合計ジャッジ時間 | 6,201 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
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()