321
社区成员




小艺酱买了一排排格子的小房子n*m,她想让k只小豚鼠每只小豚鼠都有自己的房子。 但是为了不浪费空间,她想要小房子的最外圈尽量每行每列都有一只小豚鼠居住(小豚鼠也可以住在中间的格子,只需保证房子最外围的行和列至少住一只豚鼠即可,无需每行每列都有豚鼠)。 小艺酱想知道自己有多少种方案安排小豚鼠。
嗯,这个题目必须上算法了,容斥原理啥的,如果懂的自然懂,不懂的可以看老顾的文章,反正老顾不懂。https://blog.csdn.net/superwfei/article/details/129041358
代码比较长,这里只给出 python 的代码了。
n,m,k = map(int,input().split())
def P(n):
if n < 2:
return 1
return n * P(n - 1)
def C(m,n):
return P(m) // P(m - n) // P(n)
total = 0
for i in range(16):
idx = 0
row = n
col = m
if i & 1: # 对应集合 A,最上边一行无小鼠
col -= 1
idx += 1
if i & 2: # 对应集合 B,最下边一行无小鼠
col -= 1
idx += 1
if i & 4: # 对应集合 C,最左边一列无小鼠
row -= 1
idx += 1
if i & 8: # 对应集合 D,最右边一列无小鼠
row -= 1
idx += 1
#print('i:',i,i&1,i&2,i&4,i&8,'idx:',idx,idx & 1,'row:{},col:{}'.format(row,col))
if idx & 1:
total -= int(C(row*col,k))
else:
total += int(C(row*col,k))
if k < 2 and m >1 and n >1:
print(0)
else:
print(total)