一上来看题有点晕乎,不知所云。
仔细一想【查了查题解】就是一个换位置的问题,问有多少种情况能换三次后让原来的位次不变。
1(1和1换)
2(1和2换,2和1换)(1和1换,2和2换)
3(1和1换,2和2换,3和3换)(1和2换,2和1换,3和3换)(1和3换,3和1换,2和2换)(2和3换,3和2换,1和1换)
……
这么数下去,n就可以分成两种:一、和自己换;二、和前面n-1个人中1个的换。
所以递推公式就是:a[n] = a[n-1] + a[n-2]*(n-1);
PS.一开始I64d写成I64D,WA了两次T^T
#include <cstdio>
const int MOD = 1000000007;
long long a[1000000 + 5];
int main()
{
int T;
int n;
a[1] = 1;
a[2] = 2;
for (int i = 3; i <= 1000003; ++i)
a[i] = ( a[i-1] + ((i-1)%MOD)*(a[i-2]%MOD) ) % MOD;
scanf("%d", &T);
for (int icase = 1; icase <= T; ++icase)
{
scanf("%d", &n);
printf("Case #%d:\n%I64d\n", icase, a[n]%MOD);
}
return 0;
}