传送门
题意就是数字1-n任意排列,要求有m个数,放在它们各自对应的位置上(就是1放在位置1上,2放在位置2上……),剩下n-m个数全部不在对应的位置上(比如3不在位置3上,4不在位置4上),求排列的方案数
思路:显然与组合数有关系,选择的m个数位置确定,那么就是C(m,n),而剩下的n-m个要求完全错排,我们记i个数完全错排的方案数为f(i),那么每次询问的答案就是C(m,n)*f(n-m)
对于f(i),我通过打表发现一个神奇的性质
f(i)=f(i−1)×i+(−1)if(i)=f(i-1)×i+(-1)^i
f(1)=0f(1)=0
数据范围为n,m<=10^6,所以我们完全可以O(n)预处理出f[i]。对于组合数,我们可以预处理1-10^6的阶乘,然后根据Cmn=n!m!(n−m)!C^{m}_{n}=\frac{n!}{m!(n-m)!},求m!与(n-m)!关于10^9+7的逆元进行计算
UPD 2017.1.3
补充一下错排的证明
我们要求的是令排列中的每个位置pi≠ip_i≠i,那我们就可以考虑补集转化,使排列中至少有一个位置pi=ip_i=i
这个问题我们可以通过容斥得到,所以最终答案就是

f(i)=∑i=0n(−1)in!i!

f(i)=\sum_{i=0}^n(-1)^i\frac {n!} { i!}
对于 n=1n=1, f(1)=0f(1)=0显然成立
对于 n>1n>1,归纳一下我们发现

∑i=0n(−1)in!i!=n×∑i=0n−1(−1)i(n−1)!i!+(−1)nn!n!=f(n−1)×n+(−1)n

\sum_{i=0}^n(-1)^i\frac {n!} { i!}=n×\sum_{i=0}^{n-1}(-1)^i\frac {(n-1)!} { i!}+(-1)^n\frac {n!} {n!}=f(n-1)×n+(-1)^n
注意:long long

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define mo 1000000007
#define LL long long
using namespace std;
LL fac[1000010],f[1000010];
int t,n,m;
LL inv(LL x)
{LL y=mo-2,ans=1;while (y){if (y&1) ans=ans*x%mo;x=x*x%mo;y>>=1;}return ans;
}
int main()
{fac[0]=1;for (int i=1;i<=1000000;i++) fac[i]=fac[i-1]*i%mo;f[0]=1;for (int i=2;i<=1000000;i++){f[i]=f[i-1]*i%mo;if (i&1) f[i]--;else f[i]++;}scanf("%d",&t);while (t--){scanf("%d%d",&n,&m);printf("%d\n",fac[n]*inv(fac[m])%mo*inv(fac[n-m])%mo*f[n-m]%mo);}return 0;
}

【BZOJ4517】排列计数,组合数+错排相关推荐

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

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

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

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

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

    辛勤二更 题目 题解 错排数概念 错排数递推公式及其证明 代码实现 这种题做的时候: 做完后:正常这就是生活,我们要学会习惯 题目 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n ...

  4. LeetCode-Python-634. 寻找数组的错位排列(数学 + 错排公式)

    在组合数学中,如果一个排列中所有元素都不在原先的位置上,那么这个排列就被称为错位排列. 给定一个从 1 到 n 升序排列的数组,你可以计算出总共有多少个不同的错位排列吗? 由于答案可能非常大,你只需要 ...

  5. 排列组合之错排问题总结

    目测最近要刷刷关于排列组合的题目... 所以现在将遇到的那些熟悉却已经忘记的问题都总结一下.. 第一发: 错排以及错排公式 其实错排问题对于程序算法而言,就是递归问题.因为错排的理解其实就是相当于阶乘 ...

  6. Codeforces1600数学[CodeForces - 958E1[平面几何+暴力]CodeForces - 888D [组合数+错排问题]]

    A - Guard Duty (easy) CodeForces - 958E1 题目大意:给你n个基地和m个飞船,每个基地都要分配一共飞船,每个飞船都要在一共基地,任意两台飞船到基地得直线路径上不能 ...

  7. BZOJ 4517 组合数+错排

    思路: 预处理错排 然后C(n,m)*s[n-m-1]就是答案了 特判n-m-1<0 //By SiriusRen #include <cstdio> using namespace ...

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

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

  9. 浅谈错排公式的推导及应用

    近期学弟在HDU刷题时遇到了关于错排公式的一些问题,我作为过来人就写这篇博客来指导他们~~~ 错排的定义:一段序列中一共有n个元素,那么可知这些元素一共有n!种排列方法.假如在进行排列时,原来所有的元 ...

最新文章

  1. CvArr、Mat、CvMat、IplImage、BYTE转换(总结而来)
  2. MySQL流程控制函数-if函数
  3. 深度优先搜索(DFS)----------------Tju_Oj_3517The longest athletic track
  4. jboss默认进程名称_快速指南:剖析JBoss BPM跨进程通信
  5. 【POJ - 2987】Firing(最大权闭合图,网络流最小割,输出方案最小,放大权值法tricks)
  6. oracle12c清理游标,Oracle专题12之游标
  7. 前牙正常覆盖是多少_深覆合和深覆盖两者怎么区分?花两分钟进来了解一下
  8. Android入门之login设计
  9. 一般描绘性形容词_英语中描绘性形容词是指哪种形容词?
  10. 用友系统检查iis服务器不符,安装用友U8的时候已经安装了IIS但是环境检测的时候却通不过?...
  11. 养猫有哪些坏处哪些好处呢?
  12. iOS快速清除全部的消息推送
  13. uni-app app平台微信支付
  14. 编程小白的计算机毕业设计指导开发教程-javaweb i18n国际化的使用
  15. UE4 版本迭代、资源热更、pak更新方案
  16. 远程访问服务器上的MySQL数据库
  17. 关于ext2.0基本引入说明引入过多开发环境效验太多老火
  18. 微信,新浪登录分享遇到的问题
  19. 动态虚拟服务器,AMD展示三代Opteron间虚拟服务器动态迁移
  20. 支付宝集五福可以开“外挂”? 70万人秒集齐!

热门文章

  1. 红橙Darren视频笔记 缓存方案 缓存到数据库(数据库操作) 上
  2. 计算不定方程解的个数的方法汇总
  3. m1芯片MacBook安装Apple优化版TensorFlow(虚拟环境)
  4. 【李宏毅机器学习】Semi-supervised Learning 半监督学习(p24) 学习笔记
  5. 优达学城深度学习之五——卷积神经网络
  6. mysql5.6 in走索引吗_MySQL5.6 单列、多列索引以及IN语句的优化(翻译)
  7. python接收易语言dll消息_易语言[项目开发]-插件信息提取程序源码,易语言获取DLL文件信息...
  8. 让效率“爆表”的49个数据可视化工具
  9. 微信开发---微信网页授权、JS-SDK和微信公众号的基本设置
  10. python函数定义时参数相当于占位符_python中函数的参数