辛勤二更

  • 题目
  • 题解
    • 错排数概念
    • 错排数递推公式及其证明
  • 代码实现

这种题做的时候:
做完后:正常这就是生活,我们要学会习惯

题目

求有多少种长度为 n 的序列 A,满足以下条件:
1 ~ n 这 n 个数在序列中各出现了一次
若第 i 个数 A[i] 的值为 i,则称 i 是稳定的。序列恰好有 m 个数是稳定的
满足条件的序列可能很多,序列数对 10^9+7取模。

输入格式
第一行一个数 T,表示有 T 组数据。
接下来 T 行,每行两个整数 n、m。
输出格式
输出 T 行,每行一个数,表示求出的序列数

输入输出样例
输入
5
1 0
1 1
5 2
100 50
10000 5000
输出
0
1
20
578028887
60695423
说明/提示
测试点 1 ~ 3:T=1000, n≤8, m≤8;
测试点 4 ~ 6: T=1000, n≤12,m≤12;
测试点 7 ~ 9: T=1000, n≤100, m≤100;
测试点 10 ~ 12: T = 1000,n≤1000, m≤1000;
测试点 13 ~ 14: T = 500000, n≤1000, m≤1000;
测试点 15 ~ 20: T = 500000, n≤1000000,m≤1000000。

题解

突然想感慨一番:

步入正轨↓(我真的很讨厌这种有模数的方案数题)

题意很简单,n个数固定m个数,那么就有n-m个数上的位置是不稳定的
也就是这n-m个数要满足A[i]≠i,对于这n-m中的某个位置i,就只有n-m-1种填法


错排数概念

这里就引入错排数的概念

n个有序的元素应有n!个不同的排列,如若一个排列使得所有的元素不在原来的位置上,则称这个排列为错排;有的也称之为重排

错排数递推公式及其证明

求n个数的错排数:DP[n]=(n−1)∗(DP[n−1]+DP[n−2])DP[n]=(n-1)*(DP[n-1]+DP[n-2])DP[n]=(n−1)∗(DP[n−1]+DP[n−2])
证明如下
①考虑第n个元素,把它放在某一个位置,比如位置k,一共有n-1种放法
②考虑第k个元素,这时有两种情况:
(1)把它放到位置n,那么对于除n以外的n-1个元素,由于第k个元素放到了位置n,所以剩下n-2个元素的错排即可,有f(n−2)f(n-2)f(n−2)种放法;
(2)第k个元素不放到位置n,这时对于这n-1个元素的错排,有f(n−1)f(n-1)f(n−1)种放法
运用加法以及乘法原理,得证完毕。。。


处理完n-m后,我们就要处理m,要知道选的m的位置不同算不同的方案哦(⊙o⊙)!
这个其实就是排列组合,从n个数中选m个的方案数:
Cnm=n!m!∗(n−m)!C_n^m=\frac{n!}{m!*(n-m)!}Cnm​=m!∗(n−m)!n!​

这里写出来后就发现这里面涉及到了除法,而取模运算中是不能进行除法运算的
所以我们就要去求m!m!m!和(n−m)!(n-m)!(n−m)!各自的逆元与n!n!n!相乘,
有很多方法都可以完成,费马小定理,扩展欧几里得…


代码实现

#include <cstdio>
#define mod 1000000007
#define LL long long
#define MAXN 1000000
int T, n, m;
LL sum[MAXN + 5], inv[MAXN + 5], dp[MAXN + 5];
LL qkpow ( LL x, int y ) {LL ans = 1;while ( y ) {if ( y & 1 )ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans % mod;
}
LL getinv ( LL x ) {return qkpow ( x, mod - 2 );
}
int main() {scanf ( "%d", &T );sum[0] = 1;inv[0] = 1;for ( int i = 1;i <= MAXN;i ++ ) {sum[i] = sum[i - 1] * i % mod;inv[i] = getinv ( sum[i] );}dp[0] = dp[2] = 1;for ( int i = 3;i <= MAXN;i ++ )dp[i] = ( dp[i - 1] + dp[i - 2] ) % mod * ( i - 1 ) % mod;while ( T -- ) {scanf ( "%d %d", &n, &m );printf ( "%lld\n", sum[n] * inv[n - m] % mod * inv[m] % mod * dp[n - m] % mod ); }return 0;
}

byebye~~~~~~

[SDOI2016]排列计数 (错排数概念 + 递推公式【附带证明】)相关推荐

  1. bzoj 4517: [Sdoi2016]排列计数(错排+组合数逆元)

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 1259  Solved: 766 [Submit][Sta ...

  2. 排列组合十一个性质公式及证明,错排数公式及证明

    文章目录 排列数 组合数 求组合数常用公式 定义式 递推式 杨辉三角 组合数常用性质及证明 性质一 性质二 性质三 性质四(二项式定理) 性质五 性质六 性质七 性质八 性质九 性质十 性质十一 错排 ...

  3. bzoj 4517: [Sdoi2016]排列计数

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 637  Solved: 396 [Submit][Stat ...

  4. BZOJ 4517: [Sdoi2016]排列计数 [容斥原理]

    4517: [Sdoi2016]排列计数 题意:多组询问,n的全排列中恰好m个不是错排的有多少个 容斥原理强行推♂倒她 $恰好m个不是错排 $ \[ =\ \ge m个不是错排 - \ge m+1个不 ...

  5. bzoj4517 [Sdoi2016]排列计数 组合数+错排

    这个题描述的本身就很离散,所以就相当于选出m个位置,剩下的位置的错排 错排的公式也不是很难推,注意及时利用以前的结果就好了,实在不行根据印象打表找规律 设有n个数  ,n个位置,第一个数一定不能选第一 ...

  6. P4071-[SDOI2016]排列计数【组合计数,错排】

    正题 题目链接:https://www.luogu.com.cn/problem/P4071 题目大意 每次询问n,mn,mn,m.求有多少个nnn的排列使得ai=ia_i=iai​=i的数量恰好为m ...

  7. [SDOI2016]排列计数

    Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是 ...

  8. BZOJ4517: [Sdoi2016]排列计数

    Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是 ...

  9. bzoj千题计划282:bzoj4517: [Sdoi2016]排列计数

    http://www.lydsy.com/JudgeOnline/problem.php?id=4517 组合数+错排公式 #include<cstdio> #include<ios ...

最新文章

  1. SAP成都研究院郑晓霞:Shift Left Testing和软件质量保证的一些思考
  2. asm冗余 oracle_oracle asm 磁盘管理什么场景该用什么样的冗余方式
  3. MapReduce基础开发之七Hive外部表分区
  4. cout的输出格式初探3
  5. 【产品干货】衡量移动APP“价值”的9个重要的KPI指标
  6. python 接口测试多线程_python多线程测试接口性能,就是这么简单
  7. smtplib 抄送邮件_用Python收发电子邮件
  8. NewCode----给定两个数R和n,输出R的n次方
  9. 可以获取python整数类型帮助的语句_Python入门第二课--数据类型、条件语句
  10. oracle-不完全数据库恢复-被动恢复-RMAN-06025/ORA-01190
  11. undo the local changes
  12. this super 解释
  13. VXlan 技术实现原理
  14. 《老路用得上的商学课》41-45学习笔记
  15. Linux常用命令一览表
  16. http超大文件上传方案
  17. laravel安装的几种方法总结
  18. 营收大增成Q2财报关键词,飞轮效应成达达集团业绩增长驱动力
  19. osg学习(五十四)PNG lib warning : Interlace handling should be turned on when using png_read_image
  20. 如何解决BO连接不上Oracle的问题

热门文章

  1. python葡萄酒数据集_利用python分析红葡萄酒数据
  2. 12如何隐藏dock栏_iPhone边框“变色”壁纸,隐藏Dock栏
  3. 计算机视觉招聘_INDEMIND|SLAM、计算机视觉、深度学习算法招聘(社招实习)
  4. 为什么年龄大了近视还增加_年龄明明一样大,为什么有人长得年轻,有人显老呢?...
  5. redis下载+php,php+redis实现消息队列
  6. boostrap 鼠标滚轮滑动图片_16种基于Bootstrap的css3图片hover效果
  7. c++ 多重背包状态转移方程_【考前再叮嘱】陌生方程式书写
  8. C# Task 循环任务_C# Task.Run调用外部参数
  9. fpga开发教程 labview_LabVIEW项目样例 - NI VST FPGA软件编程使用步骤与实例教程
  10. Java当中用 javabean和其他容器存入表格数据 或 利用 容器进行存储表格