結果
| 問題 |
No.3182 recurrence relation’s intersection sum
|
| コンテスト | |
| ユーザー |
detteiuu
|
| 提出日時 | 2025-07-13 00:33:32 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,258 ms / 2,000 ms |
| コード長 | 1,679 bytes |
| コンパイル時間 | 401 ms |
| コンパイル使用メモリ | 82,428 KB |
| 実行使用メモリ | 83,072 KB |
| 最終ジャッジ日時 | 2025-07-13 00:33:55 |
| 合計ジャッジ時間 | 22,191 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 40 |
ソースコード
K, L, R = map(int, input().split())
MOD = 998244353
def matrix(a, b):
ans = [[0]*len(b[0]) for _ in range(len(a))]
for i in range(len(a)):
for j in range(len(b[0])):
ans[i][j] = sum(a[i][k]*b[k][j]%MOD for k in range(len(b)))%MOD
return ans
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)
cp = CP(K)
dp = [[[0]*(K+4) for _ in range(K+4)]]
dp[0][0][0] = 1
for i in range(1, K+1):
for j in range(i+1):
dp[0][i][j] = cp.C(i, j)
dp[0][-3][-3] = K
dp[0][-2][-4] = 1
dp[0][-2][-3] = 1
dp[0][-2][-2] = K
dp[0][-1][-4] = 1
dp[0][-1][-3] = 1
dp[0][-1][-2] = K
dp[0][-1][-1] = 1
for _ in range(59):
dp.append(matrix(dp[-1], dp[-1]))
def SUM(n):
if n == -1:
return 0
ansM = [[0] for _ in range(K+4)]
ansM[0][0] = 1
ansM[-3][0] = 1
ansM[-2][0] = 1
ansM[-1][0] = 1
for i in range(60):
if 1<<i & n:
ansM = matrix(dp[i], ansM)
return ansM[-1][0]
print((SUM(R)-SUM(L-1))%MOD)
detteiuu