結果

問題 No.3119 A Little Cheat
ユーザー hirayuu_yc
提出日時 2025-04-19 10:15:50
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 305 ms / 2,000 ms
コード長 1,057 bytes
コンパイル時間 756 ms
コンパイル使用メモリ 82,656 KB
実行使用メモリ 107,600 KB
最終ジャッジ日時 2025-04-19 10:16:04
合計ジャッジ時間 13,662 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 49
権限があれば一括ダウンロードができます

ソースコード

diff #

MOD=998244353
N,M=map(int,input().split())
A=list(map(int,input().split()))
A.append(0)
if A[0]<A[1]:
    dp=[A[1]-A[0],M-A[1]+A[0]]
elif A[0]>A[1]:
    dp=[M-A[0]+A[1],A[0]-A[1]]
else:
    dp=[M,0]
for i in range(1,N):
    ndp=[0,0]
    out=[(0,0),(0,0)]
    if A[i-1]>A[i]:
        out=[(1,A[i]+1),(A[i-1]+1,M+1)]
    elif A[i-1]<A[i]:
        out=[(A[i-1]+1,A[i]+1),(0,0)]
    danger=[(0,0),(0,0)]
    if A[i]>A[i+1]:
        danger=[(A[i+1]+1,A[i]+1),(0,0)]
    elif A[i]<A[i+1]:
        danger=[(A[i+1]+1,M+1),(1,A[i]+1)]
    ol=0
    dl=0
    sl=0
    for j in range(2):
        ol+=out[j][1]-out[j][0]
    for j in range(2):
        dl+=danger[j][1]-danger[j][0]
    for j in range(2):
        for k in range(2):
            sl+= max(0,min(danger[k][1],out[j][1])-max(danger[k][0],out[j][0]))
    nl=M-ol-dl+sl
    ol-=sl
    dl-=sl
    ndp[0]=dp[0]*(ol+nl)+dp[1]*nl
    ndp[1]=dp[0]*(dl+sl)+dp[1]*dl
    dp=ndp
    dp[0]%=MOD
    dp[1]%=MOD
ans=0
for i in range(N):
    ans+=(M-A[i])*pow(M,N-1,MOD)
    ans%=MOD
print((ans+pow(M,N,MOD)-sum(dp))%MOD)
0