zoj 3687 The Review Plan I


题意抽象出来就是 在  n*n 的 棋盘中 加了 m 个禁位, 放置 n 个棋子 ,每两个棋子不在同一行 同一列,问有多少中放置方式 ?

trick  :

    M 个禁位 中 有相同 坐标的点。

解法 : 利用 有禁位的排列的公式 (容斥原理):  

n! - r1 *( n-1)! + r2*(n -2)! - r3*(n-3)! +..........

ri  指 在禁区中 选 i 个 位置的 方案数。

由于 m 的值较小 ,可直接 dfs暴力求方案数。

优化: 把独立的点(同行和同列 仅此一点 , 跟别的点不会产生冲突)统计出来。

把棋盘分割成两部分, 独立的点构成的点集 和 不独立的点构成的点集 。

不独立的爆搜  ,独立的点 组合数。

最终 根据棋盘多项式(母函数)的求法,把两部分组合起来。

加了优化之后 时间 0ms 。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define REP(i,n) for(int i=0;i




你可能感兴趣的:(组合数学)