【BZOJ4517】排列计数(SDOI2016)-组合数学:错排

原创 2018年04月17日 16:09:38

测试地址:排列计数
做法:本题需要用到组合数学中的错排问题。
首先,如果两个序列中稳定的位置不同,那么两个序列肯定不同,因此我们枚举稳定的位置,有Cnm种方案,然后对于剩下的元素,它们不能处在编号和它相同的位置上,学过组合数学的同学应该知道这就是经典的错排问题,令长为n的排列中,对所有1in都有aii的排列数为D(n)个,我们有递推式:
D(n)=(n1)(D(n1)+D(n2))
边界条件为D(0)=1,D(1)=0。那么本题的答案就是CnmD(nm)
如果只是摆递推式就太没意思了,就来讲讲这个递推式是怎么来的吧。
我们枚举1所在的位置,显然它不可能在1号位置,那么其它任意位置它都可以选,共n1种选择。然后对于它选择的位置x,我们讨论x在不在位置1上:
如果x在位置1上,那么其它n2个元素都不能在自己的位置上,方案数为D(n2)
如果x不在位置1上,那么它不能在位置1,而其它n2个元素都不能在自己的位置上,方案数为D(n1)
这就是上述递推式的由来。于是我们就解决了这一题。
以下是本人代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1000000007;
int T,n[500010],m[500010],maxn=0;
ll fac[1000010],inv[1000010],fi[1000010],D[1000010];

ll C(int n,int m)
{
    return fac[n]*fi[m]%mod*fi[n-m]%mod;
}

int main()
{
    scanf("%d",&T);
    for(int i=1;i<=T;i++)
    {
        scanf("%d%d",&n[i],&m[i]);
        maxn=max(maxn,n[i]);
    }

    fac[0]=fac[1]=inv[0]=inv[1]=fi[0]=fi[1]=1;
    D[0]=1,D[1]=0;
    for(ll i=2;i<=(ll)maxn;i++)
    {
        fac[i]=fac[i-1]*i%mod;
        inv[i]=(mod-mod/i)*inv[mod%i]%mod;
        fi[i]=fi[i-1]*inv[i]%mod;
        D[i]=(i-1)*(D[i-1]+D[i-2])%mod;
    }

    for(int i=1;i<=T;i++)
        printf("%lld\n",C(n[i],m[i])*D[n[i]-m[i]]%mod);

    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Maxwei_wzj/article/details/79976388

bzoj4517 sdoi2016 排列计数 错排

题目大意:给定n,m。求排列个数,排列满足:1、是全排列的一种。2,、有且仅有m个数a[i] = i。 嗯,今天(第一次)听说了个错排这个东西。。诶。不过开心,smz妹子给我讲哒~ 错排就是求n的排列...
  • yxr0105
  • yxr0105
  • 2016-05-26 18:50:14
  • 321

BZOJ4517 [Sdoi2016]排列计数

序列里任意m个数稳定都是等价的,考虑不稳定的那几个就是裸错排 所以错排*组合数即可 f[n-m]*C(m,n) 为什么今年省选都这么喜欢错排? 错排递推试可以看这里 #include #in...
  • neither_nor
  • neither_nor
  • 2016-04-30 13:34:16
  • 375

[BZOJ4517][Sdoi2016]排列计数(错排+组合数)

即使翅膀折了,心也要飞翔。
  • Clove_unique
  • Clove_unique
  • 2016-05-02 23:09:34
  • 489

【BZOJ4517】排列计数,组合数+错排

天真的幻想,终究只是破灭的碎梦
  • xym_CSDN
  • xym_CSDN
  • 2016-04-11 19:19:22
  • 1324

bzoj 4517: [Sdoi2016]排列计数 排列组合+动态规划

题意求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的。序列恰好有 m 个数是稳定的 满足条...
  • qq_33229466
  • qq_33229466
  • 2017-03-11 15:59:58
  • 196

[bzoj4517][Sdoi2016]排列计数(组合数学)

可以想出来的SD省选题?
  • Blue_CuSO4
  • Blue_CuSO4
  • 2017-10-09 19:59:28
  • 125

错排问题 组合数学+容斥原理

3.错排问题(problem) 【题目描述】 n本不同的书放在书架上。其中m本书已经重新摆放好,将剩下的n-m 本书也重新摆放,使每本书都不在原来放的位置。 求有几种摆法。 【输入数据】 第...
  • shiyongyang
  • shiyongyang
  • 2017-10-17 17:58:33
  • 318

组合数学--错排问题

错排问题,在IT面试笔试中都经常
  • sxh850297968
  • sxh850297968
  • 2014-10-11 15:53:12
  • 1358

bzoj4517【SDOI2016】排列计数

组合数取模+错排问题
  • AaronGZK
  • AaronGZK
  • 2016-05-11 00:37:14
  • 2658

bzoj4517: [Sdoi2016]排列计数

赤果果的错排…#include #include #include #include #include #define rep(i,k,n) for(int i=k;i=(n);i--) #defin...
  • limboman
  • limboman
  • 2016-04-30 09:40:36
  • 143
收藏助手
不良信息举报
您举报文章:【BZOJ4517】排列计数(SDOI2016)-组合数学:错排
举报原因:
原因补充:

(最多只允许输入30个字)