p 7 4禮尚往來

2021-10-01 08:30:43 字數 1249 閱讀 5072

1. 題目描述

吉哥還是那個吉哥,那個江湖人稱「嘰嘰哥」的基哥。每當節日來臨,女友眾多的嘰嘰哥總是能從全國各地的女友那裡收到各種禮物。有禮物收到當然值得高興,但回禮確是件麻煩的事!無論多麻煩,總不好意思收禮而不回禮,那也不是嘰嘰哥的風格。現在,即愛面子又摳門的嘰嘰哥想出了乙個絕妙的好辦法:他準備將各個女友送來的禮物合理分配,再回送不同女友,這樣就不用再花錢買禮物了!假設嘰嘰哥的n個女友每人送他乙個禮物(每個人送的禮物都不相同),現在他需要合理安排,再回送每個女友乙份禮物,重點是,回送的禮物不能是這個女友之前送他的那個禮物,不然,嘰嘰哥可就攤上事了,攤上大事了…現在,嘰嘰哥想知道總共有多少種滿足條件的回送禮物方案呢?

2. 輸入格式:
輸入資料第一行是個正整數t,表示總共有t組測試資料(t <= 100); 每組資料報含乙個正整數n,表示嘰嘰哥的女友個數為n( 1 <= n <= 100 )。

3.輸出格式:

4. 輸入樣例:

312

4

5. 輸出樣例:
019

6. 解題思路
典型的錯排,錯排方法如下:當n個編號元素放在n個編號位置,元素編號與位置編號各不對應的方法數用d(n)表示,那麼d(n-1)就表示n-1個編號元素放在n-1個編號位置,各不對應的方法數,其它類推.

第一步,把第n個元素放在乙個位置,比如位置k,一共有n-1種方法;

第二步,放編號為k的元素,這時有兩種情況:⑴把它放到位置n,那麼,對於剩下的n-1個元素,由於第k個元素放到了位置n,剩下n-2個元素就有d(n-2)種方法;⑵第k個元素不把它放到位置n,這時,對於這n-1個元素,有d(n-1)種方法;

綜上得到

d(n) = (n-1) [d(n-2) + d(n-1)]

特殊地,d(1) = 0, d(2) = 1.

// 吉吉哥送禮物 

#include

using

namespace std;

typedef

long

long ll;

ll dp[

110]

;const

int mod=

1e9+7;

intmain()

printf

("%lld\n"

,dp[n]);

}return0;

}