要满足每个格子都能被共击,那么就要使每一行都有车,或者每一列都有车。以每一行都有车为例,设有 j 列放了车。由于每多一列,能相互共击的车的对数就会减 1,因此放 j 列车就有 n−j 对车能相互共击。题目要求 k 对车能相互共击,那么只能在 n−k 列放置车 (显然 k⩾n时答案为 0)。从 n 列选取 n−k 列的方案数为 Cnn−k。接下来考虑在 n−k 列中放入 n 个车,每列不空的方案数。
令 Pi 表示事件: 在这 n−k 列中第 i 列没有放车。由容斥原理有 ∣P1∩P2∩...∩Pn−k∣=N−1<=i<=n−k∑∣Pi∣+1<=i<j<=n−k∑∣Pi∩Pj∣−1<=i<j<q<=n−k∑∣Pi∩Pj∩Pq∣+...+(−1)n−k∣P1∩P2∩...∩Pn−k∣。
设一列下标集合S,大小为∣S∣(∣S∣<=n−k),这样的集合有Cn−k∣S∣个。则满足 ∀i∈S,第 i 列没有放车的方案数为 (n−k−∣S∣)n,即 n 个车放在剩下 n−k−∣S∣ 列的任意一个中的方案数。根据前面的公式,容易得出每一行都有车且满足题目条件的方案数为 Cnn−ki=0∑n−k(−1)iCn−ki(n−k−i)n。如果 k 不等于 0,则每一行都有车和每一列都有车不等价,总的答案应该乘以 2,即 2Cnn−ki=0∑n−k(−1)iCn−ki(n−k−i)n。