1867: 禮上往來
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 230 Solved: 70
SubmitStatusWeb Board
Description
每當節日來臨,女友衆多的xxx總是能從全國各地的女友那裏收到各種禮物。
有禮物收到當然值得高興,但回禮確是件麻煩的事!
無論多麻煩,總不好意思收禮而不回禮,那也不是xxx的風格。
現在,即愛面子又摳門的xxx想出了一個絕妙的好辦法:他準備將各個女友送來的禮物合理分配,再回送不同女友,這樣就不用再花錢買禮物了!
假設xxx的n個女友每人送他一個禮物(每個人送的禮物都不相同),現在他需要合理安排,再回送每個女友一份禮物,重點是,回送的禮物不能是這個女友之前送他的那個禮物,不然,xxx可就攤上事了,攤上大事了......
現在,xxx想知道總共有多少種滿足條件的回送禮物方案呢?
Input
輸入數據第一行是個正整數T,表示總共有T組測試數據(T <= 100); 每組數據包含一個正整數n,表示嘰嘰哥的女友個數爲n( 1 <= n <= 100 )。
Output
請輸出可能的方案數,因爲方案數可能比較大,請將結果對10^9 + 7 取模後再輸出。 每組輸出佔一行。
Sample Input
Sample Output
HINT
//題目大意:給你一個數n,求1,2,3....n的錯位排列的個數.結果對10^9+7取餘.
//解題思路:參考組合數學-錯位排列.這裏我是利用推論解得:D[1]=0,D[2]=1,1~n的錯位排列D[n]=n*D[n-1]+(-1)^n;
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define INF 1000000007
long long solve(int n)
{
long long sum=1,i,j,k;
if(n==2) return 1;
long long d2=1;
for(i=3;i<=n;i++)
{
k=pow(-1,i);
sum=(i*d2+k)%INF;
d2=sum;
}
return sum;
}
int main()
{
int i,j,k,t,n;
long long result=0;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
if(n>1)
result=solve(n);
printf("%lld\n",result);
}
return 0;
}