2018.10.25 bzoj4517: [Sdoi2016]排列计数(组合数学)
传送门
组合数学简单题。
Ans=(nm)∗1Ans=\binom {n} {m}*1Ans=(mn)∗1~(n−m)(n-m)(n−m)的错排数。
前面的直接线性筛逆元求。
后面的错排数递推式本蒟蒻竟然推出来了。
首先说说为什么Ans=(nm)∗1Ans=\binom {n} {m}*1Ans=(mn)∗1~nnn-mmm的错排数。
考虑首先选出mmm个排列正确的数有(nm)\binom {n} {m}(mn)种选法。
然后剩下的n−mn-mn−m个数因为有严格的大小关系相当于只需要保证每个数与其下标不相同。
那么我们把这n−mn-mn−m个数提出来。
它们的错排数跟111~nnn-mmm的错排数是相同的。
因此就是是这样了。
所以错排数怎么推呢?
假设已经求出了1,11,11,1~2,12,12,1 ~ 333 … 111 ~ nnn-111的错排数,要求111~nnn的错排数。
我们设111~iii的错排数为f[i]f[i]f[i]。
考虑现在在某个排列111~i−1i-1i−1中加入iii (i≥2)(i \geq 2)(i≥2)。
那么有两种情况。
- 已有的排列中排列正确的数个数为0,那么只用从原排列中随便选个数放到第iii个位置,然后拿iii去填空就行了,方案数为(i−1)∗f[i−1](i-1)*f[i-1](i−1)∗f[i−1]。
- 已有的排列中排列正确的数个数为1,那么把这个数挪到第iii个位置,然后用iii去填空就行了,由于i−1i-1i−1个数都有可能成为那个排列正确的数,而且对于剩下的i−2i-2i−2个数都是错排的,因此方案数为(i−1)∗f[i−2](i-1)*f[i-2](i−1)∗f[i−2]
=>f[i]=(i−1)∗(f[i−1]+f[i−2])f[i]=(i-1)*(f[i-1]+f[i-2])f[i]=(i−1)∗(f[i−1]+f[i−2])
代码:
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
const int mod=1e9+7,N=1e6+5;
int T,n,m,f[N],ifac[N],fac[N];
int main(){
T=read();
f[0]=1,f[1]=0,fac[0]=fac[1]=ifac[1]=ifac[0]=1;
for(int i=2;i<=N-5;++i)fac[i]=1ll*fac[i-1]*i%mod,ifac[i]=1ll*(mod-mod/i)*ifac[mod%i]%mod,f[i]=1ll*(f[i-1]+f[i-2])*(i-1)%mod;
for(int i=2;i<=N-5;++i)ifac[i]=1ll*ifac[i]*ifac[i-1]%mod;
while(T--)n=read(),m=read(),printf("%d\n",1ll*fac[n]*ifac[m]%mod*ifac[n-m]%mod*f[n-m]%mod);
return 0;
}
2018.10.25 bzoj4517: [Sdoi2016]排列计数(组合数学)的更多相关文章
- BZOJ4517:[SDOI2016]排列计数(组合数学,错排公式)
Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是 ...
- BZOJ4517 Sdoi2016 排列计数 【DP+组合计数】*
BZOJ4517 Sdoi2016 排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 ...
- bzoj-4517 4517: [Sdoi2016]排列计数(组合数学)
题目链接: 4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 846 Solved: 530[Submit][ ...
- [BZOJ4517][SDOI2016]排列计数(错位排列)
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1616 Solved: 985[Submit][Statu ...
- [SDOI2016] 排列计数 (组合数学)
[SDOI2016]排列计数 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰 ...
- bzoj4517[Sdoi2016]排列计数(组合数,错排)
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1792 Solved: 1111[Submit][Stat ...
- 洛谷P4071 [SDOI2016] 排列计数 [组合数学]
题目传送门 排列计数 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m ...
- [BZOJ4517] [Sdoi2016] 排列计数 (数学)
Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是 ...
- BZOJ 4517: [Sdoi2016]排列计数(组合数学)
题面 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m ...
随机推荐
- PHPlaravel中从数据库中选择数据是增加时间条件及各种条件
注:附加条件后要加get函数. 1.public function getForDataTable($startTime,$endTime){ return $this->query() -&g ...
- 【转】将项目打成war包并用tomcat部署的方法,步骤及注意点
部署的遇到第一个问题,就是tomcat和jdk的环境问题: 首先 理解为啥要关注这二者的环境呢?他们还是有关系的–tomcat 作为比较流行的java Web服务器也是用java来实现的一个比较大的软 ...
- 【分布式架构】“spring cloud”与“dubbo”微服务的对比
秉承站在巨人的肩膀上,同时我也不想重复制造轮子,我发现了一系列关于“分布式架构”方面,我需要,同时能够解决我的一些疑惑.问题的博客,转载过来,原文链接: http://blog.csdn.net/ ...
- VS unable to update auto-refresh path。。。。
手工创建提示报错的路径,重新生成,成功
- __block的初步用法
再block中使用 self 时,要在前面加上__block. 防止在block中用到self时把self对象retain, 造成内存泄露. __block UIViewController *saf ...
- mysql中各种join连表查询总结
通常我们需要连接多个表查询数据,以获取想要的结果. 一.连接可以分为三类: (1) 内连接:join,inner join (2) 外连接:left join,left outer join,righ ...
- Beyound Compare中比较java字节码class文件
背景 项目维护的时候版本混乱或者外出在现场项目排错的时候难免要比对两个jar/class/war文件的源代码. 通常情况下这个时候我们用jd-gui直接把文件拖进去比对,这种情况只适合单一文件的比对. ...
- 开启Windows文件共享必须开启的两个服务
开启Windows文件共享必须开启的两个服务分别是: 1.Server服务. 2.Workstation服务. 如果文件共享丢失,可以去首先去查看这两个服务是否停止,如果停止,请启动或者重启.
- const修饰符用法
1. 将一个对象设置为不可修改 const int a = 100; 2. 指向const对象的指针 const int* p = 3;可以通过指针来修改指针所指向的值,但是不能通过指针*p修改对像的 ...
- Oracle触发器(trigger):一般用法
trigger和procedure,function类似,只不过它不能被显示调用,只能被某个事件触发然后oracle自动去调用.常用的一般是针对一个表或视图创建一个trigger,然后对表或视图做某些 ...