zzulioj1867(組合數學&錯位排列)

1867: 禮上往來

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 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

3
1
2
4

Sample Output

0
1
9

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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章