結果
問題 |
No.2983 Christmas Color Grid (Advent Calender ver.)
|
ユーザー |
|
提出日時 | 2024-12-08 04:15:02 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 601 ms / 3,340 ms |
コード長 | 1,204 bytes |
コンパイル時間 | 4,207 ms |
コンパイル使用メモリ | 252,896 KB |
最終ジャッジ日時 | 2025-02-26 11:34:18 |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 64 |
ソースコード
#include <bits/stdc++.h> #include <atcoder/all> using namespace std; using mint = atcoder::modint; int main(){ int h, w, m; long long k; cin >> h >> w >> k >> m; mint::set_mod(m); const int r = h * w; vector<int> T(r), cnt(r + 1); for(int y = 0; y < h; y++){ for(int x = 0; x < w; x++){ int v = y * w + x; if(y) T[v] |= 1 << v - w; if(y + 1 < h) T[v] |= 1 << v + w; if(x) T[v] |= 1 << v - 1; if(x + 1 < w) T[v] |= 1 << v + 1; } } vector<bool> used(1 << r); for(int i = 0; i < r; i++) used[1 << i] = true; for(int S = 1; S < (1 << r); S++){ if(!used[S]) continue; int U = S, R = S, V; while(R){ U |= V = T[__lg(R & -R)]; R -= R & -R; while(V){ used[S | V & -V] = true; V -= V & -V; } } cnt[__builtin_popcount(S)] += 1 << (r - __builtin_popcount(U)); } mint ans, div; for(int i = 1; i <= r; i++){ ans += mint::raw(cnt[i]) * mint::raw(i).pow(k); div += mint::raw(i).inv(); } ans *= div / (1 << r); cout << ans.val() << '\n'; }