結果
問題 | No.3119 A Little Cheat |
ユーザー |
|
提出日時 | 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 |
ソースコード
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)