結果
| 問題 |
No.3182 recurrence relation’s intersection sum
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-06-13 23:11:05 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,042 ms / 2,000 ms |
| コード長 | 1,791 bytes |
| コンパイル時間 | 305 ms |
| コンパイル使用メモリ | 82,652 KB |
| 実行使用メモリ | 83,668 KB |
| 最終ジャッジ日時 | 2025-06-13 23:11:23 |
| 合計ジャッジ時間 | 16,925 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 40 |
ソースコード
MOD = 998244353
def modinv(x):
return pow(x, MOD - 2, MOD)
def setup_comb(n):
fac = [1] * (n + 1)
ifac = [1] * (n + 1)
for i in range(2, n + 1):
fac[i] = fac[i - 1] * i % MOD
ifac[n] = modinv(fac[n])
for i in range(n, 0, -1):
ifac[i - 1] = ifac[i] * i % MOD
return fac, ifac
def binom(n, k, fac, ifac):
if k < 0 or k > n: return 0
return fac[n] * ifac[k] % MOD * ifac[n - k] % MOD
def matmul(a, b):
n, m, l = len(a), len(b[0]), len(b)
res = [[0] * m for _ in range(n)]
for i in range(n):
for k in range(l):
aik = a[i][k]
if aik == 0: continue
for j in range(m):
res[i][j] = (res[i][j] + aik * b[k][j]) % MOD
return res
def matpow(mat, power):
size = len(mat)
res = [[1 if i == j else 0 for j in range(size)] for i in range(size)]
while power:
if power & 1:
res = matmul(res, mat)
mat = matmul(mat, mat)
power >>= 1
return res
def solve(k, l, r):
fac, ifac = setup_comb(k + 10)
size = k + 4
m = [[0] * size for _ in range(size)]
for i in range(size):
if i == 0:
m[0][0] = k
m[0][1] = 1
m[0][k + 2] = 1
elif 1 <= i <= k + 1:
top = k - (i - 1)
for j in range(i, k + 2):
m[i][j] = binom(top, k + 1 - j, fac, ifac)
elif i == k + 2:
m[i][k + 2] = k
elif i == k + 3:
m[i][0] = 1
m[i][i] = 1
ml = matpow(m, l)
mr = matpow(m, r + 1)
ans = (
mr[k + 3][0] + mr[k + 3][k + 1] + mr[k + 3][k + 2]
- ml[k + 3][0] - ml[k + 3][k + 1] - ml[k + 3][k + 2]
) % MOD
print(ans)
k, l, r = map(int, input().split())
solve(k, l, r)