結果
問題 |
No.2959 Dolls' Tea Party
|
ユーザー |
![]() |
提出日時 | 2025-04-16 15:59:41 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,391 bytes |
コンパイル時間 | 426 ms |
コンパイル使用メモリ | 81,804 KB |
実行使用メモリ | 119,476 KB |
最終ジャッジ日時 | 2025-04-16 16:03:30 |
合計ジャッジ時間 | 6,718 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 5 TLE * 1 -- * 27 |
ソースコード
import sys MOD = 998244353 def main(): N, K = map(int, sys.stdin.readline().split()) A = list(map(int, sys.stdin.readline().split())) max_fact = K fact = [1] * (max_fact + 1) for i in range(1, max_fact + 1): fact[i] = fact[i-1] * i % MOD inv_fact = [1] * (max_fact + 1) inv_fact[max_fact] = pow(fact[max_fact], MOD-2, MOD) for i in range(max_fact-1, -1, -1): inv_fact[i] = inv_fact[i+1] * (i+1) % MOD def get_divisors(n): divisors = set() for i in range(1, int(n**0.5)+1): if n % i == 0: divisors.add(i) divisors.add(n//i) return sorted(divisors) divisors = get_divisors(K) def compute_phi(m): res = m i = 2 while i * i <= m: if m % i == 0: res = res // i * (i-1) while m % i == 0: m //= i i += 1 if m > 1: res = res // m * (m-1) return res phi_cache = {} for d in divisors: m = K // d if m not in phi_cache: phi_cache[m] = compute_phi(m) total = 0 for d in divisors: m = K // d S = 0 T = [] for a in A: b = a // m x_max = min(b, d) if x_max >= d: S += 1 else: T.append(x_max) S_poly = [0] * (d + 1) for k in range(d + 1): S_poly[k] = pow(S, k, MOD) * inv_fact[k] % MOD dp = [0] * (d + 1) dp[0] = 1 for x_max in T: new_dp = [0] * (d + 1) for k in range(d + 1): if dp[k] == 0: continue for x in range(0, x_max + 1): if k + x > d: break new_dp[k + x] = (new_dp[k + x] + dp[k] * inv_fact[x]) % MOD dp = new_dp coeff = 0 for k in range(d + 1): if d - k < 0 or d - k > d: continue coeff = (coeff + S_poly[k] * dp[d - k]) % MOD res = coeff * fact[d] % MOD res = res * phi_cache[m] % MOD total = (total + res) % MOD inv_K = pow(K, MOD-2, MOD) ans = total * inv_K % MOD print(ans) if __name__ == '__main__': main()