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

被折叠的 条评论
为什么被折叠?



