全排列 全錯排

2021-10-05 05:59:04 字數 1990 閱讀 9514

全排列:

即線性代數中的全排列

eg:123 132 213 231 312 321

如八皇后問題上可轉化為全排列篩選出abs(a[i]-a[j])!=abs(i-j)即為總數。

c++全排列函式next_permutation(first,last)。可將陣列或容器生成全排列

int a[3]

=;dowhile

(next_permutation

(a,a+3)

);

全錯排概念:

考慮乙個有n個元素的排列,若乙個排列中所有的元素都不在自己原來的位置上,那麼這樣的排列就稱為原排列的乙個錯排。 n個元素的錯排數記為d(n)。 研究乙個排列錯排個數的問題,叫做錯排問題或稱為更列問題。

典型例子:

1. 乙個人寫了n封不同的信及相應的n個不同的信封,他把這n封信都裝錯了信封,都裝錯信封的裝法有多少種(歷史有名的「裝錯信封問題」);

2. 將一排書重新擺放,要求每本書都不擺在原來的位置,一共有幾種不同的擺法;

3. [sdut 2058] 小廝將每一封信都投錯了烽火台(乙個烽火台一封),一共有多少種可能的情況;

4. 幾個人各寫一張賀年卡互相贈送,共有多少種贈送方法(因為不能送自己)。

組合數學上的錯排公式:

d(n) = n! [(-1)^2/2! + … + (-1)^(n-1)/(n-1)! + (-1)^n/n!]

簡化版本:

d(n) = [n!/e+0.5] ,其中e是自然對數的底,[x]為x的整數部分

這個公式放這裡目前就用來漲漲自己的見識。它可以通過容斥原理來推導,也可以通過遞推推導,而遞推公式即我們的重點。

當n個編號元素放在n個編號位置,元素編號與位置編號各不對應的方法數用d(n)表示,那麼d(n-1)就表示n-1個編號元素放在n-1個編號位置,各不對應的方法數,其它類推.

intd(int n)

time limit: 1000 ms memory limit: 65536 kib

submit

statistic

discuss

problem description

話說天下大勢,分久必合,合久必分。。。卻道那魏蜀吳三國鼎力之時,多少英雄豪傑以熱血譜寫那千古之絕唱。古人誠不我欺,確是應了那句「一將功成萬骨枯」。 

是夜,明月高懸。諸葛丞相輕搖羽扇,一臉愁苦。原來是日前蜀國戰事吃緊,丞相徹夜未眠,奮筆急書,於每個烽火台寫下安排書信。可想,這戰事多變,丞相運籌 帷幄,給諸多烽火台定下不同計策,卻也實屬不易。

誰成想這送信小廝竟投靠曹操,給諸葛丞相暗中使壞。這小廝將每封書信都投錯了烽火台,居然沒有一封是對的。不多時小廝便被抓住,前後之事卻也明朗。這可急壞了諸葛丞相,這書信傳錯,勢必會讓蜀軍自亂陣腳,不攻自破啊! 諸葛丞相現在想知道被這小廝一亂,這書信傳錯共有多少種情況。

input

題目有多組資料,處理到檔案結尾,丞相共寫了n(1 <= n <= 20)封書信,輸入乙個正數n。

output

輸出書信傳錯的情況數。

sample input

1

36

sample output

0

2265

#include

typedef

long

long ll;

ll f[

50] ;

intmain

()

while(~

scanf(

"%d",&n))

return

0 ;

}

全錯位排列

給你看道幾乎一樣的題目 五個編號為1 5的小球放進5個編號為1 5的小盒裡面,全錯位排列 即1不放1,2不放2,依次類推 一共有多少種放法 這是著名的信封問題,很多著名的數學家都研究過 瑞士數學家尤拉按一般情況給出了乙個遞推公式 用a b c 表示寫著n位友人名字的信封,a b c 表示n份相應的寫...

下一排列問題(全排列暴力)

time limit 1000 ms memory limit 32768 kb description lele 最近上課的時候都很無聊,所以他發明了乙個數字遊戲來打發時間。這個遊戲是這樣的,首先,他拿出幾張紙片,分別寫上0到9之間的任意數字 可重複寫某個數字 然後,他叫同學隨便寫兩個數字x和k。...

全排列實現數字1 9排序

在為藍橋杯比賽備考過程中,真正體驗到自己程式設計能力的薄弱。在一次小練習中接觸全排列這一演算法。基於對全排列的熟悉掌握,通過c語言 實現數字1 9的全排列。當然也可以進行全排列的拓展。c語言實現數字1 9全排列 include int m 9 int count 0 double s 9 void ...