传送门

组合数学简单题。


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)。

那么有两种情况。

  1. 已有的排列中排列正确的数个数为0,那么只用从原排列中随便选个数放到第iii个位置,然后拿iii去填空就行了,方案数为(i−1)∗f[i−1](i-1)*f[i-1](i−1)∗f[i−1]。
  2. 已有的排列中排列正确的数个数为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]排列计数(组合数学)的更多相关文章

  1. BZOJ4517:[SDOI2016]排列计数(组合数学,错排公式)

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

  2. BZOJ4517 Sdoi2016 排列计数 【DP+组合计数】*

    BZOJ4517 Sdoi2016 排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 ...

  3. bzoj-4517 4517: [Sdoi2016]排列计数(组合数学)

    题目链接: 4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 846  Solved: 530[Submit][ ...

  4. [BZOJ4517][SDOI2016]排列计数(错位排列)

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1616  Solved: 985[Submit][Statu ...

  5. [SDOI2016] 排列计数 (组合数学)

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

  6. bzoj4517[Sdoi2016]排列计数(组合数,错排)

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1792  Solved: 1111[Submit][Stat ...

  7. 洛谷P4071 [SDOI2016] 排列计数 [组合数学]

    题目传送门 排列计数 题目描述 求有多少种长度为 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 4517: [Sdoi2016]排列计数(组合数学)

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

随机推荐

  1. 102. Binary Tree Level Order Traversal (Tree, Queue; BFS)

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  2. 微信小程序开发——导航失效的解决办法

    异常描述: 使用 navigator 导航,各种属性配置没问题,就是点击死活不跳转. 异常分析: 遇到这种情况,要先考虑的就是当前配置的导航url,是不是已经使用在tabBar中,因为小程序对于nav ...

  3. ret和retf

    ret指令用栈中的数据,修改IP的内容,从而实现近转移; retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移. CPU执行ret指令时,进行下面两步操作: (IP) = ((ss)*16+ ...

  4. Selenium + Python + Firefox

    按网上教程搭建好环境后,执行下面的代码出现了错误: 测试代码如下: from selenium import webdriver driver=webdriver.Firefox() driver.g ...

  5. pthreads v3下一些坑和需要注意的地方

    一.子线程无法访问父线程的全局变量,但父线程可以访问子线程的变量 <?php class Task extends Thread { public $data; public function ...

  6. JsRender 学习总结

    jsRender 三个最重要的概念:模板.容器和数据. 最重要的是:view(视图) 是我们定义的模板,上下文是视图所用的对象. 一.基础. {{:}} 和 {{>}}(或{{html:}})两 ...

  7. 【gRPC使用问题4】

    1.进行gRPC服务调用出错:服务不可用 2.解决方案: linux系统部署的节点服务的确不可用,愿意是 系统是泡在虚拟机里面, 计算核数只有一核,太小,服务没有跑起来.

  8. vue(ajax:axios中文文档)

    axios 基于http客户端的promise,面向浏览器和nodejs 特色 浏览器端发起XMLHttpRequests请求 node端发起http请求 支持Promise API 监听请求和返回 ...

  9. How to use GM MDI interface for programming

    GM has had its newest programming/J2534 Pass Thru device on the market for some years now. A lot has ...

  10. node.js 在使用child_process 模块时候,调试端口占用的问题解决方案(EADDRINUSE)

    在fork的时候,带参数{ execArgv: ['--debug=' + (process.debugPort +   1)] }