wcyz為了迎接百年校慶,美化校園,請了校友笨笨將n座雕塑,準備安置在校園內,整個校園可以抽象成乙個nxn的大網格,每個lxl網格最多只能安置一座雕塑,但是某些lxl的網格上恰好是乙個食堂或湖泊,這些網格是不能安置雕塑的,每個雕塑的造型相同,這樣同一種安置方案中交換排列都算一種。任意雕塑在同一行或同一列是不合法的方案。
學校想知道有多少種安置方案,笨笨想從中選擇最好的一種方案,笨笨想請你告訴他方案種數。
【輸入格式】
第一行,兩個整數n,m(n≤20,m≤10),用空格隔開,n表示nxn的大網格,m表示不能安置雕塑的位置的個數。
第二行至m+l行,每行兩個數x,y,用空格分開,表示座標(x,y)的lxl的網格上不能安置雕塑。
【輸出格式】
乙個數,方案種數(方案種數≤263_1)
sample input
6 711
212 2
3 33 4
4 34 4
sample output
184#include
#include
#include
using namespace std;
int h[100],s[100];
long long d[100],r[100],ans;
int a[100][3],n,m,i,j;
void dfs(int x,int y)
for (int j=x+1;j<=m;j++)
if (h[a[j][1]]==0&&s[a[j][2]]==0) }
int main()
{freopen("sculpture.in","r",stdin);
freopen("sculpture.out","w",stdout);
scanf("%d%d",&n,&m);
for (i=1;i<=m;i++)
scanf("%d%d",&a[i][1],&a[i][2]);
for (i=1;i<=m;i++)
dfs(0,i);
d[0]=1;
for (i=1;i<=n;i++)
d[i]=d[i-1]*i;
ans=1;
for (i=1;i<=n;i++)
ans*=i;
for (i=1;i<=m;i++)//這裡採用了非常神奇的容斥原理
if (i%2==1)
ans-=r[i]*d[n-i];
else
ans+=r[i]*d[n-i];
cout/ps:容斥原理設s
為有窮集,p1
、p2、
…pn是
n條性質。
s中的任一元素
x對於這n條性
質可能符合其中的1種、
2種、…、
n種,也可能都不符合。設
ai表示s中
具有pi
性質的元素構成的子集。有限集合
a中的元素個數記為
|a|。這時
容斥原理可敘述為:
s中不具有性質p1
、p2、
…pn的元素個數有:
諸侯安置 簡單的遞推
problem description 很久以前,有乙個強大的帝國,它的國土呈正方形狀 45度看 如圖所示。這個國家有若干諸侯。由於這些諸侯都曾立下赫赫戰功,國王準備給他們每人一塊封地 正方形中的一格 但是,這些諸侯又非常好戰,當兩個諸侯位於同一行或同一列時,他們就會開戰。如下圖為n 3時的國土,陰...
Vijos P1501 笨笨的果實採摘
笨笨在小山頂上種了一棵果樹,秋天了,果樹結出了許多許多的果子,笨笨要去摘果子。這是一棵可以結出3種不同果實的樹,它的果實長在樹枝的分叉處和樹頂上。果實分3種 普通果實 奇異果實和稀有果實。這顆樹的第乙個分叉可以用乙個2進製碼表示 也就是許多的 1 和 0 而第乙個分叉又分成2個分叉,分別用第乙個分叉...
VIJOS P1571 笨笨的飛彈攻擊
為了徹底打擊目標,笨笨要使用足夠多的飛彈去打擊目標。每個飛彈有各自的編號,這些編號有可能重複 現在需要將其中一部分飛彈按順序抽調出來並按原順序排列,使得這些被抽取出來的飛彈奇數字置的編號大於其前乙個的編號,偶數字置的編號小於其前乙個的編號,這樣子才能夠正常使用這些飛彈攻擊目標。笨笨想知道,他最多能夠...