#include using namespace std; const long long MOD = 998244353; /* a^e (mod MOD) */ long long mod_pow(long long a,long long e){ long long r=1%MOD, x=a%MOD; for(;e;e>>=1,x=(__int128)x*x%MOD) if(e&1) r=(__int128)r*x%MOD; return r; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N; long long M; if(!(cin>>N>>M)) return 0; vector A(N); for(auto &v:A) cin>>v; /* --- BASE 部 --- */ long long sum=0; for(auto a:A){ sum += (M-a)%MOD; if(sum>=MOD) sum-=MOD; } long long powM_N1 = mod_pow(M, N-1); long long BASE = (__int128)powM_N1*sum % MOD; if(N==1){ // スワップが無い cout< lo(N-1), hi(N-1), len(N-1); vector sig(N-1); // +1,0,-1 for(int i=0;iA[i+1]?-1:0); } long long Mmod = M%MOD; long long Sall = Mmod; // B1 … 何でも OK long long Sin = len[0]%MOD; // B1 が I0 の “中” /* 1 本ずつ処理 */ for(int i=0;ix) inter=y-x; // (x, y] } long long Sall_n, Sin_n=0; if(s==1){ /* 上り */ Sall_n = ( (__int128)lcur*Sin + (__int128)(M-lcur)*Sall ) % MOD; if(i!=N-2) Sin_n = ( (__int128)inter*Sin + (__int128)(lnext-inter)*Sall )%MOD; }else if(s==-1){ /* 下り */ long long Sout = (Sall - Sin + MOD)%MOD; Sall_n = ( (__int128)lcur*Sall + (__int128)(M-lcur)*Sout ) % MOD; if(i!=N-2) Sin_n = ( (__int128)inter*Sall + (__int128)(lnext-inter)*Sout )%MOD; }else{ /* 同値 */ Sall_n = (__int128)Mmod*Sall % MOD; if(i!=N-2) Sin_n = (__int128)lnext*Sall % MOD; } Sall = Sall_n; Sin = Sin_n; // advance } long long T = Sall; // 禁止パターン無しの列数 long long powM_N = (__int128)powM_N1*Mmod % MOD; long long extra = (powM_N - T + MOD) % MOD; cout << (BASE + extra) % MOD << '\n'; return 0; }