Problem 4. derange
Input file: derange.in
Output file: derange.out
Time limit: 1 second
Memory limit: 256 MB
Mr. Hu 需要给机房的n 位同学重新安排位置,为了使换位的效果好,需要保证每位同学在排位前和排
位后所在的位置都不同。
Mr. Hu 想知道有多少种可能的排位方法。因为排位数可能很大,所以你只需要输出它模109 +7 的结果。
Input
输入文件中只有1 个数n,表示学生人数。
Output
输出可能的排位数取模后的结果。
Sample
derange.in
3
derange.out
2
Note
样例说明:假设一开始三个人的位置为(1; 2; 3),那么合法的换位结果为:(2; 3; 1) 和(3; 1; 2)。
• 对于30% 的数据,1 n 9
• 对于70% 的数据,1 n 103
• 对于100% 的数据,1 n 106
#include<cstdio>
#include<iostream>
using namespace std;
const int N = 100000 + 5;
const int mod = 1000000000 + 7;
typedef long long ll;
ll ans[N];
int n;
int main(){
freopen("derange.in","r",stdin);
freopen("derange.out","w",stdout);
scanf("%d", &n);
ans[1] = 0;ans[2] = 1;
for( int i = 3; i <= n; i++ )
ans[i] = (i-1) * (ans[i-1]+ans[i-2]) % mod;
printf("%d", (int)ans[n]);
return 0;
}