結果
| 問題 |
No.2837 Flip Triomino
|
| コンテスト | |
| ユーザー |
momoyuu
|
| 提出日時 | 2024-08-09 21:43:57 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 8 ms / 2,000 ms |
| コード長 | 1,887 bytes |
| コンパイル時間 | 1,166 ms |
| コンパイル使用メモリ | 119,932 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-08-09 21:44:00 |
| 合計ジャッジ時間 | 2,306 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 34 |
ソースコード
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
using ll = long long;
#include<atcoder/modint>
using mint = atcoder::modint998244353;
int main(){
cin.tie(nullptr);
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
vector<string> s(n);
for(int i = 0;i<n;i++) cin>>s[i];
vector<vector<int>> use;
vector<vector<int>> vis(n,vector<int>(m,0));
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
if(vis[i][j]) continue;
int ni = i;
int nj = j;
int a = 0;
int b = 0;
int c = 0;
while(true){
if(ni<0||ni>=n||nj<0||nj>=m) break;
vis[ni][nj]++;
if(s[ni][nj]=='W') a++;
else if(s[ni][nj]=='B') b++;
else c++;
ni++;nj--;
}
vector<int> now;
now.push_back(a);
now.push_back(b);
now.push_back(c);
use.push_back(now);
}
}
vector<mint> fac(1001,1),ifac(1001);
for(int i = 1;i<=1000;i++) fac[i] = fac[i-1] * i;
for(int i = 0;i<=1000;i++) ifac[i] = fac[i].inv();
int k = use.size();
vector<vector<vector<mint>>> dp(k+1,vector<vector<mint>>(2,vector<mint>(2,0)));
dp[0][0][0] = 1;
for(int i = 0;i<k;i++){
int can = use[i][2];
for(int j = 0;j<=can;j++){
mint tmp = fac[can] * ifac[j] * ifac[can-j];
int b = use[i][1] + j;
b %= 2;
for(int p = 0;p<2;p++){
for(int q = 0;q<2;q++){
int np = 0;
int nb = b + p + q;
nb %= 2;
if(nb==1) np = 1;
dp[i+1][q][np] += dp[i][p][q] * tmp;
}
}
}
}
cout<<dp[k][0][0].val()<<endl;
}
momoyuu