結果
問題 |
No.3117 Reversible Tile
|
ユーザー |
|
提出日時 | 2025-04-18 21:01:51 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 410 ms / 3,000 ms |
コード長 | 1,406 bytes |
コンパイル時間 | 2,028 ms |
コンパイル使用メモリ | 199,412 KB |
実行使用メモリ | 198,912 KB |
最終ジャッジ日時 | 2025-04-18 21:02:00 |
合計ジャッジ時間 | 8,656 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 24 |
ソースコード
#include <bits/stdc++.h> using namespace std; //#include<atcoder/all> //using namespace atcoder; using ll = long long int; using ull = unsigned long long int; using ld = long double; constexpr ll MAX = 2000000000000000000; constexpr ld PI = 3.14159265358979; constexpr ll MOD = 998244353;//2024948111; ld dotorad(ld K){ return PI * K / 180.0; } ld radtodo(ld K){ return K * 180.0 / PI; } mt19937 mt; void randinit(){ srand((unsigned)time(NULL));mt = mt19937(rand()); } int main(){ ll N,M; cin >> N >> M; vector<ll> A(N + 2,0); for(ll i = 0;i < N;i++) cin >> A[i + 1]; ll s = 0; for(ll i = 0;i < N + 1;i++) if(A[i] != A[i + 1]) s++; vector<vector<ll>> DP(M + 1,vector<ll>(N + 2,0)); DP[0][s] = 1; for(ll i = 0;i < M;i++){ for(ll j = 0;j <= N + 1;j++){ if(j + 2 <= N + 1){ ll kouho = (N + 1 - j) * (N - j) / 2; DP[i + 1][j + 2] += (DP[i][j] * kouho) % MOD; DP[i + 1][j + 2] %= MOD; } { ll kouho = (N + 1 - j) * j; DP[i + 1][j] += (DP[i][j] * kouho) % MOD; DP[i + 1][j] %= MOD; } if(j - 2 >= 0){ ll kouho = (j) * (j - 1) / 2; DP[i + 1][j - 2] += (DP[i][j] * kouho) % MOD; DP[i + 1][j - 2] %= MOD; } } } cout << DP[M][0] << endl; }