結果
問題 | No.2838 Diagonals |
ユーザー | karinohito |
提出日時 | 2024-08-09 21:50:11 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 16 ms / 2,000 ms |
コード長 | 1,896 bytes |
コンパイル時間 | 4,635 ms |
コンパイル使用メモリ | 268,292 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-08-09 21:50:17 |
合計ジャッジ時間 | 5,547 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 20 |
ソースコード
#include <bits/stdc++.h> using namespace std; #include<atcoder/all> using namespace atcoder; using ll = long long; const ll mod=998244353; using mint=modint998244353; using vm = vector<mint>; using vvm = vector<vm>; using vvvm = vector<vvm>; vector<mint> fact, factinv, inv, factK; void prenCkModp(ll n) { // factK.resize(4*n+5); fact.resize(n + 5); factinv.resize(n + 5); inv.resize(n + 5); fact[0] = fact[1] = 1; factinv[0] = factinv[1] = 1; inv[1] = 1; for (ll i = 2; i < n + 5; i++) { fact[i] = (fact[i - 1] * i); inv[i] = (mod - ((inv[mod % i] * (mod / i)))); factinv[i] = (factinv[i - 1] * inv[i]); } } mint nCk(ll n, ll k) { if (n < k || k < 0) return 0; return (fact[n] * ((factinv[k] * factinv[n - k]))); } int main() { ll N,M; cin>>N>>M; mint an=1; ll cnt=0; vector<string> S(N); dsu d(N*M); for(int i=0;i<N;i++){ cin>>S[i]; for(int j=0;j<M;j++){ if(S[i][j]=='#'){ an*=4; cnt++; } } } mint iv=mint(2).inv(); ll bnt=0; for(int i=0;i<N;i++){ for(int j=0;j<M;j++){ if(i!=N-1&&S[i][j]=='#'&&S[i+1][j]=='#'){ if(d.same(i*M+j,(i+1)*M+j)){ an*=iv; bnt++; } d.merge(i*M+j,(i+1)*M+j); } if(j!=M-1&&S[i][j]=='#'&&S[i][j+1]=='#'){ if(d.same(i*M+j,i*M+j+1)){ an*=iv; bnt++; } d.merge(i*M+j,i*M+j+1); } } } // cout<<cnt<<" "<<bnt<<endl; // mint bn=1; // for(int i=0;i<610;i++){ // bn*=2; // if(bn.val()==993502162){ // cout<<i<<endl; // cout<<"PP"<<endl; // } // } cout<<an.val()<<endl; }