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 ...
随机推荐
- Example of Formalising a Grammar for use with Lex & Yacc
Here is a sample of a data-file that we want to try and recognise. It is a list of students and info ...
- Compare Version Numbers(STRING-TYPE CONVERTION)
QUESTION Compare two version numbers version1 and version1.If version1 > version2 return 1, if ve ...
- Codeforces Beta Round #40 (Div. 2)
Codeforces Beta Round #40 (Div. 2) http://codeforces.com/contest/41 A #include<bits/stdc++.h> ...
- js和jquery实现图片无缝轮播的不同写法
多掌握一种方法总是会有好处的,学习编程就要多思考,举一反三 下面写一下实现图片自动播放的代码,由于学习的是javascript,代码量很大,所以又学习了jquery库的操作,非常简便 还有非常有逼格的 ...
- ActiveMQ之java Api
ActiveMQ 安全机制 activemq的web管理界面:http://127.0.0.1:8161/admin activemq管控台使用jetty部署,所以需要修改密码则需要修改相应的配置文件 ...
- 服务器使用VMware系软件管理主机集群
在服务器安装ESXI 6.0系统,此系统300多M,用于管理服务器上的主机. 其他主机安装个vsphere client连接后可ESXI系统可进行简单管理 如果要更强大的功能,需要安装vcenter ...
- Could not get lock /var/lib/dpkg/lock更新问题
发生于apt-get update或apt update时. 常见手段,先试试: sudo rm /var/lib/dpkg/lock sudo rm /var/lib/apt/lists/lock ...
- iOS 打包方式
https://www.cnblogs.com/wengzilin/p/4601684.html
- 大话listview之设置item监听器无效大坑之一:item设了属性clickable
今天一个listview设置item监听器居然没有作用: 看了半天,怀疑是item设置了这个属性, 于是删了,果然就可以了. 大坑 ...
- cgi fast-cgi php-fpm区别
php-cli 是php在系统执行的程序,直接执行php文件: cgi和fast-cgi的区别1.cgi和fast-cgi都是php解析协议,负责解析服务器分发过来的php动态文件:cgi程序就会去解 ...