結果
| 問題 | No.3538 Not First Place |
| コンテスト | |
| ユーザー |
detteiuu
|
| 提出日時 | 2026-05-08 22:36:52 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 1,042 ms / 5,000 ms |
| コード長 | 1,779 bytes |
| 記録 | |
| コンパイル時間 | 143 ms |
| コンパイル使用メモリ | 85,120 KB |
| 実行使用メモリ | 394,240 KB |
| 最終ジャッジ日時 | 2026-05-08 22:37:12 |
| 合計ジャッジ時間 | 17,589 ms |
|
ジャッジサーバーID (参考情報) |
judge1_1 / judge3_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 26 |
ソースコード
class CP:
def __init__(self, N):
self.fact = [1]*(N+1)
self.fact_inv = [1]*(N+1)
for i in range(2, N+1):
self.fact[i] = self.fact[i-1]*i%MOD
self.fact_inv[N] = pow(self.fact[N], -1, MOD)
for i in reversed(range(1, N)):
self.fact_inv[i] = self.fact_inv[i+1]*(i+1)%MOD
def C(self, N, K):
if N < 0 or K < 0 or N < K:
return 0
return self.fact[N]*self.fact_inv[K]%MOD*self.fact_inv[N-K]%MOD
def P(self, N, K):
if N < 0 or K < 0 or N < K:
return 0
return self.fact[N]*self.fact_inv[N-K]%MOD
def H(self, N, K):
if N < 0 or K < 0:
return 0
if N == K == 0: return 1
return self.C(N+K-1, K)
MOD = 998244353
cp = CP(10**7*2)
N, M, K, L = map(int, input().split())
ans = cp.H(N, K*M)
for i in range(1, N+1):
if K*M < (M+1)*i: break
if i%2 == 1:
ans -= cp.C(N, i)*cp.H(N, K*M-(M+1)*i)%MOD
ans %= MOD
else:
ans += cp.C(N, i)*cp.H(N, K*M-(M+1)*i)%MOD
ans %= MOD
for i in range(L):
cnt = K*M-i
SUM = cp.H(N-1, cnt)
for j in range(1, N):
if cnt < (M+1)*j: break
if j%2 == 1:
SUM -= cp.C(N-1, j)*cp.H(N-1, cnt-(M+1)*j)%MOD
SUM %= MOD
else:
SUM += cp.C(N-1, j)*cp.H(N-1, cnt-(M+1)*j)%MOD
SUM %= MOD
ans -= SUM
ans %= MOD
for i in range(L, M+1):
cnt = K*M-i
SUM = cp.H(N-1, cnt)
for j in range(1, N):
if cnt < (i+1)*j: break
if j%2 == 1:
SUM -= cp.C(N-1, j)*cp.H(N-1, cnt-(i+1)*j)%MOD
SUM %= MOD
else:
SUM += cp.C(N-1, j)*cp.H(N-1, cnt-(i+1)*j)%MOD
SUM %= MOD
ans -= SUM
ans %= MOD
print(ans)
detteiuu