这道题是数学题,由题目可知,m个稳定数的取法是Cnm

然后剩下n-m本书,由于编号为i的书不能放在i位置,因此其方法数应由错排公式决定,即D(n-m)

  错排公式:D[i]=(i-1)*(D[i-1]+D[i-2]);

所以根据乘法原理,答案就是Cnm * D(n-m)

接下来就是怎么求组合数的问题了

由于n≤1000000,因此只能用O(n)的算法求组合,这里用乘法逆元(inv[])来辅助求组合数

即 Cnm = n! / ((n-m)! * m!) = fac[n]*inv[n-m]*inv[m]

那么乘法逆元是什么呢?

假设一个数a,且a关于P的乘法逆元为x

那么 ax≡1 (mod P). 当且仅当 a 与 P 互质时x有解

简单的说,就是找一个数x,使得(x*a) mod P = 1

不难得出三者符合 ax+Py=1 (裴蜀定理), y可能是负数

因此我们可以用拓展欧几里得算出x的值,即为乘法逆元(用inv保存)

对于求出inv的过程,我们可以不必每次暴力求拓展欧几里得,可由下列递推式O(n)求出

  inv[i]=(i+1)*inv[i+1]

而D数组只要O(n)推即可,其中D[0]=1, D[1]=0;

这道题让我明白。。组合数可以O(n)求得,了解了乘法逆元是什么,并且了解到世界上有个叫错排公式的神奇东西Orz

 #include<stdio.h>
 #include<algorithm>
 #include<string.h>
 #define LL long long
 using namespace std;
 ;
 ;
 int T,n,m;
 LL f[maxn],inv[maxn],d[maxn];

 inline void read(int &x){
     ;
     ') c=getchar();
     +c-, c=getchar();
 }

 inline LL ex_gcd(LL &x, LL &y, LL a, LL b){
     ){
         x=; y=;
         return a;
     }
     LL res=ex_gcd(x,y,b,a%b);
     LL t=x; x=y;
     y=t-a/b*x;
     return res;
 }

 inline LL calc(LL a, LL b){
     LL x,y;
     if (ex_gcd(x,y,a,b) == 1LL)
         return (x+b)%b;
 }

 int main(){
     read(T);
     f[]=;
     ; i<=maxn; i++) f[i]=f[i-] * (LL)i % MOD;
     inv[]=calc(f[],MOD);
     ; i>=; i--) inv[i]=inv[i+] * (LL)(i+) % MOD;
     d[]=; d[]=; d[]=;
     ; i<=maxn; i++) d[i]=(LL)(i-)*(d[i-]+d[i-]) % MOD;
     while (T--){
         read(n); read(m);
         LL ans=1LL;
         //printf("haha %lld %lld %lld %lld\n", f[n], inv[n-m], inv[m], d[n-m]);
         ans=ans*f[n]*inv[n-m] % MOD;
         ans=ans*inv[m] % MOD;
         ans=ans*d[n-m] % MOD;
         printf("%lld\n", ans);
     }
     ;
 }

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. [BZOJ4517][SDOI2016]排列计数(错位排列)

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

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

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

  5. 2018.10.25 bzoj4517: [Sdoi2016]排列计数(组合数学)

    传送门 组合数学简单题. Ans=(nm)∗1Ans=\binom {n} {m}*1Ans=(mn​)∗1~(n−m)(n-m)(n−m)的错排数. 前面的直接线性筛逆元求. 后面的错排数递推式本蒟 ...

  6. BZOJ4517——[Sdoi2016]排列计数

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

  7. BZOJ4517: [Sdoi2016]排列计数

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

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

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

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

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

随机推荐

  1. Sql Server 常用系统存储过程大全

    -- 来源于网络 -- 更详细的介结参考联机帮助文档 xp_cmdshell --*执行DOS各种命令,结果以文本行返回. xp_fixeddrives --*查询各磁盘/分区可用空间 xp_logi ...

  2. [转载]void及void*的深度剖析

    void的含义 void即"无类型",void *则为"无类型指针",可以指向任何数据类型. void指针使用规范 ①void指针可以指向任意类型的数据,亦即可 ...

  3. Windows安装java

    1.下载并安装java(jdk)//在官网下载即可——http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363. ...

  4. Linux查看系统配置常用命令

    Linux查看系统配置常用命令: 系统 # uname -a # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue # 查看操作系统版本# cat /proc/cpuinfo ...

  5. CSS里的pointer-events属性

    现代浏览器里CSS的职责范围和JavaScript的越来越模糊分不清.比如CSS里-webkit-touch-callout属性在iOS里能禁止当用户点击时弹出气泡框.而本文要说的pointer-ev ...

  6. js:方法3. 对象

    Object.constructor object.constructor a = new Array(1,2,3); // Create an object a.constructor == Arr ...

  7. CentOS7安装docker出错(Transaction check error)

    1. 出错内容: Transaction check error: :-.el7_2..x86_64 conflicts with :-.el7.x86_64 :-.el7_2..x86_64 con ...

  8. Python学习笔记02

      元组:圆括号的,不能进行赋值操作,即不可更改. 列表:方括号的,可以修改. 访问:均使用下标访问   # 元组是一个静态列表,初始化之后就不可以修改,可以试任意类型 tuple1 = ('a st ...

  9. Guacamole 介绍以及架构

    Guacamole的介绍以及架构 guacd Web应用程序 在Guacamole中与用户打交道的就是Web应用程序. 之前说过,Web应用程序自己不实现任何的远程桌面协议.Web应用程序依赖guac ...

  10. Teamwork[HDU4494]

    Teamwork Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submi ...