結果
| 問題 |
No.3182 recurrence relation’s intersection sum
|
| コンテスト | |
| ユーザー |
timi
|
| 提出日時 | 2025-06-17 16:28:28 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 208 ms / 2,000 ms |
| コード長 | 2,388 bytes |
| コンパイル時間 | 425 ms |
| コンパイル使用メモリ | 82,360 KB |
| 実行使用メモリ | 77,316 KB |
| 最終ジャッジ日時 | 2025-06-17 16:28:36 |
| 合計ジャッジ時間 | 7,616 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 40 |
ソースコード
mod = 998244353 # a Random BIG Prime number
def ipow(base:int, power:int):
ret, piv = 1, base
while power:
if (power & 1):
ret = ret * piv % mod
piv = piv * piv % mod
power >>= 1
return ret
def berlekamp_massey(x:list):
ls, cur = [], []
lf, ld = 0, 0
for i in range(len(x)):
t = 0
for j in range(len(cur)):
t = (t + x[i-j-1] * cur[j]) % mod
if (t-x[i]) % mod == 0:
continue
if not cur:
cur = [0] * (i+1)
lf = i
ld = (t-x[i]) % mod
continue
k = -(x[i]-t) * ipow(ld, mod-2) % mod
c = [0] * (i-lf-1)
c.append(k)
for j in ls:
c.append(-j * k % mod)
if len(c) < len(cur):
c += [0] * (len(cur)-len(c))
for j in range(len(cur)):
c[j] = (c[j]+cur[j]) % mod
if (i-lf+len(ls)) >= len(cur):
ls, lf, ld = cur, i, (t-x[i])%mod
cur = c
for i in cur:
i = (i % mod + mod) % mod
return cur
def get_nth(rec:list, dp:list, n:int):
m = len(rec)
s, t = [0]*m, [0]*m
s[0] = 1
if m != 1:
t[1] = 1
else:
t[0] = rec[0]
def mul(v:list, w:list):
m = len(v)
t = [0]*(2*m)
for j in range(m):
for k in range(m):
t[j+k] += v[j] * w[k] % mod
if t[j+k] >= mod:
t[j+k] -= mod
for j in range(2*m-1, m-1, -1):
for k in range(1, m+1):
t[j-k] += t[j] * rec[k-1] % mod
if t[j-k] >= mod:
t[j-k] -= mod
# Resize idk if this is required
if len(t) < m:
t += [0]*(m-len(t))
else:
t = t[:m]
return t
while n:
if n & 1:
s = mul(s, t)
t = mul(t, t)
n >>= 1
ret = 0
for i in range(m):
ret += s[i] * dp[i] % mod
return ret % mod
def guess_nth_term(x:list, n:int):
if n < len(x):
return x[n]
v = berlekamp_massey(x)
if not v:
return 0
return get_nth(v, x, n)
K,L,R=map(int, input().split())
S=[1]
A=[1]
for i in range(0,10000):
s=A[-1]*K+pow(i,K,mod)+pow(K,i,mod)
s%=mod
A.append(s)
S.append((S[-1]+s)%mod)
l=0
if L!=0:
l=guess_nth_term(S,L-1)
r=guess_nth_term(S,R)
print((r-l)%mod)
timi