笨笨的雕塑安置

2021-07-08 20:18:07 字數 1546 閱讀 8561

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 笨笨的飛彈攻擊

為了徹底打擊目標,笨笨要使用足夠多的飛彈去打擊目標。每個飛彈有各自的編號,這些編號有可能重複 現在需要將其中一部分飛彈按順序抽調出來並按原順序排列,使得這些被抽取出來的飛彈奇數字置的編號大於其前乙個的編號,偶數字置的編號小於其前乙個的編號,這樣子才能夠正常使用這些飛彈攻擊目標。笨笨想知道,他最多能夠...