您的位置:首页 > 其它

2016 百度之星 大搬家

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

假设n个数有s
中组合,所以对第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
%1000000007);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: