2015百度之星资格赛1001
题目名称:大搬家
题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=584&pid=1001
思路:
因为第三次三次后恢复到第一次的样子,所以第二次和没搬家的时候也是完全相同的,所以搬家情况有可能有两家换,也有可能都没换(原因是换两次和没换一样,不懂的动手写下),即假设有n户人需要搬家,符合条件的方案数为a[n],当有另外一家人要搬家的时候,如果他不搬,那么方案数为a[n],如果他要搬家,那么他与任意其中一户人家形成一对,则剩下的人的方案数为a[n-1]。则,a[n+1]=a[n]+n*a[n-1]。值得注意的是,n*a[n-1]会溢出int,所以要用long long来存。而且a[1]=1,a[2]=2。
代码如下:
#include<cstdio> #include<cstring> #include<iostream> #include<string> #include<algorithm> #include<cmath> #include<set> using namespace std; long long a[1000005]={0,1,2}; const int INF=0x3f3f3f3f; const int MOD=1000000007; int main() { int t; for(int i=3;i<1000005;i++) { a[i]=(a[i-1]+(i-1)*a[i-2])%MOD; } while(scanf("%d",&t)!=EOF) { int N; for(int j=1;j<=t;j++) { scanf("%d",&N); printf("Case #%d:\n%I64d\n",j,a[N]); } } return 0; }
本文版权归作者本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.