結果

問題 No.767 配られたジャパリまん
ユーザー ayaoni
提出日時 2021-08-04 04:34:09
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 734 ms / 2,000 ms
コード長 2,085 bytes
コンパイル時間 158 ms
コンパイル使用メモリ 82,292 KB
実行使用メモリ 137,280 KB
最終ジャッジ日時 2024-09-16 15:00:00
合計ジャッジ時間 3,561 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 6
other AC * 15
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

import sys
def I(): return int(sys.stdin.readline().rstrip())
def MI(): return map(int,sys.stdin.readline().rstrip().split())
def LI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def LI2(): return list(map(int,sys.stdin.readline().rstrip()))
def S(): return sys.stdin.readline().rstrip()
def LS(): return list(sys.stdin.readline().rstrip().split())
def LS2(): return list(sys.stdin.readline().rstrip())
H,W,k = MI()
mod = 10**8+7
friends = []
for _ in range(k):
a,b = MI()
friends.append((W+1)*a+b)
fac = [1]
for i in range(1,H+W+1):
fac.append((fac[-1]*i) % mod)
fac_inv = [0]*(H+W+1)
f = pow(fac[-1],mod-2,mod)
for i in range(H+W,-1,-1):
fac_inv[i] = f
f *= i
f %= mod
def comb(n,r):
return fac[n] * fac_inv[r] % mod * fac_inv[n-r] % mod
K = 1 << k
F = [0]*K
for i in range(K):
X = [0]
for j in range(k):
if not (i >> j) & 1:
X.append(friends[j])
X.sort()
X.append((W+1)*H+W)
f = 1
for j in range(len(X)-1):
a0,b0 = divmod(X[j],W+1)
a1,b1 = divmod(X[j+1],W+1)
if a0 > a1 or b0 > b1:
break
f *= comb((a1-a0)+(b1-b0),a1-a0)
f %= mod
else:
F[i] = f
def mobius_transform(F,n):
# res[i] = (ij (-1)^(#j-#i)F[j] )
N = 1 << n
res = F[:]
for i in range(n):
k = 1 << i
for j in range(N):
if not j & k:
res[j] -= res[j^k]
res[j] %= mod
return res
G = mobius_transform(F,k)[::-1]
def bit_count(n):
c = (n & 0x5555555555555555) + ((n >> 1) & 0x5555555555555555)
c = (c & 0x3333333333333333) + ((c >> 2) & 0x3333333333333333)
c = (c & 0x0f0f0f0f0f0f0f0f) + ((c >> 4) & 0x0f0f0f0f0f0f0f0f)
c = (c & 0x00ff00ff00ff00ff) + ((c >> 8) & 0x00ff00ff00ff00ff)
c = (c & 0x0000ffff0000ffff) + ((c >> 16) & 0x0000ffff0000ffff)
c = (c & 0x00000000ffffffff) + ((c >> 32) & 0x00000000ffffffff)
return c
for i in range(K):
if bit_count(i) % 2 == 1:
G[i] = (-G[i]) % mod
print(*G,sep='\n')
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0