[机房练习赛4.6] derange

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值