結果
問題 |
No.1846 Good Binary Matrix
|
ユーザー |
|
提出日時 | 2025-09-17 07:32:53 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 671 ms / 2,000 ms |
コード長 | 915 bytes |
コンパイル時間 | 968 ms |
コンパイル使用メモリ | 93,120 KB |
実行使用メモリ | 18,724 KB |
最終ジャッジ日時 | 2025-09-17 07:33:03 |
合計ジャッジ時間 | 9,968 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 35 |
ソースコード
#include <iostream> #include <vector> #include <atcoder/modint> using namespace std; using namespace atcoder; using mint = modint1000000007; vector<mint> fac, finv; mint comb(int n ,int k) { mint ret = fac[n]; ret *= finv[k];ret *= finv[n-k]; return ret; } int main() { int H, W;cin >> H >> W; int T = H + W + 100; fac.assign(T+1, 1); finv.assign(T+1, 1); for (int i = 1;i <= T;i++) fac[i] = i * fac[i-1]; for (int i = 1;i <= T;i++) finv[i] = mint(fac[i]).inv(); mint als = 0; for (int i = 1;i < W;i++) { mint s = mint(2).pow(W-i) - 1; s = mint(s).pow(H); s *= comb(W, i); if (i%2 == 1) { als += s; } else { als -= s; } } mint ret = als; for (int i = 1;i <= H;i++) { mint s = mint(2).pow(H-i); s = mint(s).pow(W); s *= comb(H, i); if (i%2 == 1) { ret += s; } else { ret -= s; } } mint ans = mint(mint(2).pow(W)).pow(H) -ret; cout << ans.val() << endl; }