結果
| 問題 |
No.1846 Good Binary Matrix
|
| コンテスト | |
| ユーザー |
👑 SPD_9X2
|
| 提出日時 | 2022-02-18 22:56:15 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 743 ms / 2,000 ms |
| コード長 | 1,608 bytes |
| コンパイル時間 | 180 ms |
| コンパイル使用メモリ | 81,920 KB |
| 実行使用メモリ | 237,568 KB |
| 最終ジャッジ日時 | 2024-06-29 09:42:18 |
| 合計ジャッジ時間 | 13,169 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 35 |
ソースコード
"""
包除原理で解きそう
全部0で埋める行・列の個数によって変化してしまうな…
まず、行か列の片方だけ求める?
少なくともX個列が0で埋まっている時、少なくともY個行が0で埋まっている場合の数
O(HW)解は
Σ nCr(H,x) * nCr(W,y) * pow( 2 , H*W-x*W-H*y+x*y , mod ) * pow(-1,x+y,mod)
で求まる
分離できないか?
H*W - x*W - H*y + x*y
= (H-x)*(W-y)
分離できてないじゃん
採用 = 2^k
不採用 = -1
A[i+1] = A[i] * ( 2^k-1 )
"""
import sys
from sys import stdin
def modfac(n, MOD):
f = 1
factorials = [1]
for m in range(1, n + 1):
f *= m
f %= MOD
factorials.append(f)
inv = pow(f, MOD - 2, MOD)
invs = [1] * (n + 1)
invs[n] = inv
for m in range(n, 1, -1):
inv *= m
inv %= MOD
invs[m - 1] = inv
return factorials, invs
def modnCr(n,r):
return fac[n] * inv[n-r] * inv[r] % mod
mod = 10**9+7
fac,inv = modfac(10**6+100,mod)
p2 = [1]
for i in range(10**6+100):
p2.append(p2[-1]*2 % mod)
H,W = map(int,stdin.readline().split())
ans = 0
for unpick in range(0,H+1):
pick = H-unpick
bi = p2[pick]
now = pow(bi-1,W,mod)
ans += now * modnCr(H,unpick) * ( (-1)**(unpick%2) )
ans %= mod
print (ans % mod)
"""
A = 0
for x in range(0,H+1):
now = modnCr(H,x) * p2[H-x]
if now % 2 == 0:
A += now
else:
A -= now
B = 0
for y in range(0,W+1):
now = modnCr(W,y) * p2[W-y]
if now % 2 == 0:
B += now
else:
B -= now
print (A,B)
print (A*B%mod)
"""
SPD_9X2