BZOJ4517 [Sdoi2016]排列计数

来源:互联网 发布:装修设计软件 编辑:程序博客网 时间:2024/05/19 14:35

序列里任意m个数稳定都是等价的,考虑不稳定的那几个就是裸错排

所以错排*组合数即可

f[n-m]*C(m,n)

为什么今年省选都这么喜欢错排?

错排递推试可以看这里

#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<iomanip>#include<cstring>#include<cmath>#include<ctime>#include<vector>#include<stack>#include<queue>#include<set>#include<bitset>#include<map>using namespace std;#define MAXN 1000010#define MAXM 10010#define INF 1000000000#define MOD 1000000007#define ll long long#define eps 1e-8ll fac[MAXN],ine[MAXN];int n,m;ll f[MAXN];int main(){    int i;    fac[0]=ine[0]=ine[1]=1;    for(i=1;i<MAXN;i++){        fac[i]=fac[i-1]*i%MOD;    }    for(i=2;i<MAXN;i++){        ine[i]=(MOD-MOD/i)*ine[MOD%i]%MOD;    }    for(i=2;i<MAXN;i++){        ine[i]=ine[i-1]*ine[i]%MOD;    }    f[0]=1;    f[1]=0;    f[2]=1;    for(i=3;i<=1000000;i++){        f[i]=(f[i-1]+f[i-2])*(i-1)%MOD;    }    int tmp;    scanf("%d",&tmp);    while(tmp--){        scanf("%d%d",&n,&m);        printf("%lld\n",fac[n]*ine[m]%MOD*ine[n-m]%MOD*f[n-m]%MOD);    }    return 0;} /*51 2 1 1 2 */


0 0