1. 題目描述
吉哥還是那個吉哥,那個江湖人稱「嘰嘰哥」的基哥。每當節日來臨,女友眾多的嘰嘰哥總是能從全國各地的女友那裡收到各種禮物。有禮物收到當然值得高興,但回禮確是件麻煩的事!無論多麻煩,總不好意思收禮而不回禮,那也不是嘰嘰哥的風格。現在,即愛面子又摳門的嘰嘰哥想出了乙個絕妙的好辦法:他準備將各個女友送來的禮物合理分配,再回送不同女友,這樣就不用再花錢買禮物了!假設嘰嘰哥的n個女友每人送他乙個禮物(每個人送的禮物都不相同),現在他需要合理安排,再回送每個女友乙份禮物,重點是,回送的禮物不能是這個女友之前送他的那個禮物,不然,嘰嘰哥可就攤上事了,攤上大事了…現在,嘰嘰哥想知道總共有多少種滿足條件的回送禮物方案呢?2. 輸入格式:
輸入資料第一行是個正整數t,表示總共有t組測試資料(t <= 100); 每組資料報含乙個正整數n,表示嘰嘰哥的女友個數為n( 1 <= n <= 100 )。3.輸出格式:
4. 輸入樣例:
3125. 輸出樣例:4
0196. 解題思路
典型的錯排,錯排方法如下:當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;
}