2016 百度之星 大搬家

  dp,根据题意可以推算出,n个数中只有两种情况,要么是自己跟自己交换,要么是两个之间相互交换,即 a-a 或者 b-c c-b,

假设n个数有s[n]中组合,所以对第n个数进行讨论,他可以在前面的各种情况中直接插入n-n,所以有s[n-1]种组合,他也任意从n-1个数中选择一个进行两两交换,即(n-1)*s[n-2](n-2代表n-1个数中一共有n-2中 a-a形式的组合)

#include <cstdio>
#include <iostream>

using namespace std;
long long int s[1000006];
int main()
{
	int T,n;
	cin >> T;
	s[0] = s[1] = 1;
	for(int i=2; i<1000001; i++)
		s[i] = (s[i-1] + (i-1)*s[i-2])%1000000007;
	int count = 0;
	while(T--)
	{
		count++;
		
		scanf("%d",&n);
		printf("Case #%d:\n",count);
		printf("%I64d\n",s[n]%1000000007);
	}	
	return 0;
} 


你可能感兴趣的:(2016 百度之星 大搬家)