題目:K - 不容易系列之一
你們經常感慨,要作好一件事情真的不容易,確實,失敗比成功容易多了!
作好「一件」事情尚且不易,若想永遠成功而總從不失敗,那更是難上加難了,就像花錢老是比掙錢容易的道理同樣。
話雖這樣說,我仍是要告訴你們,要想失敗到必定程度也是不容易的。好比,我高中的時候,就有一個神奇的女生,在英語考試的時候,居然把40個單項選擇題所有作錯了!你們都學過幾率論,應該知道出現這種狀況的機率,因此至今我都以爲這是一件神奇的事情。若是套用一句經典的評語,咱們能夠這樣總結:一我的作錯一道選擇題並不難,難的是所有作錯,一個不對。
不幸的是,這種小几率事件又發生了,並且就在咱們身邊:
事情是這樣的——HDU有個網名叫作8006的男性同窗,結交網友無數,最近該同窗玩起了浪漫,同時給n個網友每人寫了一封信,這都沒什麼,要命的是,他居然把全部的信都裝錯了信封!注意了,是所有裝錯喲!
如今的問題是:請你們幫可憐的8006同窗計算一下,一共有多少種可能的錯誤方式呢?
Input
輸入數據包含多個多個測試實例,每一個測試實例佔用一行,每行包含一個正整數n(1<n<=20),n表示8006的網友的人數。
Output
對於每行輸入請輸出可能的錯誤方式的數量,每一個實例的輸出佔用一行。
Sample Input
2
3
Sample Output
1
2數組
思路:這個題目是一個錯排問題,即所有排錯的意思。這個是與所有排對相對的一種。是每次全排中的一種狀況。而後提早把每一個的錯排的方式的數量記錄下來,這樣以後直接根據下標輸出對應的數便可;測試
新技巧:錯排:共i個長度,假如一個錯排數列中的第n項和第m項還有第k項,m項中存着應該是第n項的數,n項存着第k項中的數,那麼若是交換n,m,則第n項變成正確的了,若是k與m相同,則n與m均爲正確的。這時候錯誤的爲i-2的長度;
因此這種的狀況爲i-1個;若是k和m不一樣,則m中爲k,則只用n爲正確的,則這種對應的m有i-1中可能(即除了正確的n)這是錯誤的爲i-1的長度;
因此實現用數組爲:a[i]=(i-1)a[i-1]+(i-1)a[i-2];(和斐波那契數列很像);code
代碼:事件
#include<stdio.h> int main() { long long a[21]; a[1]=0;a[2]=1; for(int i=3;i<=20;i++) a[i]=(i-1)*a[i-1]+(i-1)*a[i-2]; int n; while(scanf("%d",&n)!=EOF) { printf("%lld\n",a[n]); } return 0; }