http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=695&pid=1001
#include <stdio.h>
const int M=1000010;
__int64 dp[M];
int main() // 题意:要想使第三次搬家和第一次搬家一样
{
//则 第二次搬家的结果和没搬家之前的状态一定是一样的
long t,n,i; //要有解 则选择的方案必须是 '交换'的 比如 a->b b->a 这样重复用两次方案才能恢复成原来的状态
dp[1]=1;
dp[2]=2;
for(i=3;i<=M;i++)
{
dp[i]=(dp[i-1]+(i-1)*dp[i-2])%1000000007;// 分两类: 第n个人不动 n->n dp[n-1]
} //第n个人 到A位置 则A肯定到n位置 n->A A->n n 有 n-1位置个选择 换完后剩下 n-2个人
scanf("%d",&t); // (n-1)*dp[n-2]
for(i=1;i<=t;i++)
{
scanf("%ld",&n);
printf("Case #%d:\n%I64d\n",i,dp[n]);
}
return 0;
}