错排公式 + 组合数学取mod板子

来源:互联网 发布:vmware for ubuntu 64 编辑:程序博客网 时间:2024/05/29 14:27

不带解释版的

define ll long long intll D[maxn],fac[maxn],inv[maxn];void init(){    D[0] = 1; D[1] = 0; D[2] = 1;    for(ll i=3;i<=maxn;i++){        D[i] = (i-1)*(D[i-1]+D[i-2]) % mod;    }    fac[0] = 1;    for(ll i=1;i<maxn;i++) fac[i] = (fac[i-1]*i) % mod;    inv[maxn-1] = qpow(fac[maxn-1],mod-2);    for(ll i=maxn-2;i>=0;i--) inv[i] = (inv[i+1]*(i+1) % mod);}ll C(int n,int m){    return fac[n] * inv[m] % mod * inv[n-m] % mod;}

带解释版的

define ll long long intll D[maxn],fac[maxn],inv[maxn];//D是错排公式,fac是阶乘数组,inv是对应阶乘的逆元.void init(){    //D[0]初始化为0或1要看题.    D[0] = 1; D[1] = 0; D[2] = 1;    for(ll i=3;i<=maxn;i++){        D[i] = (i-1)*(D[i-1]+D[i-2]) % mod;    }    fac[0] = 1;    for(ll i=1;i<maxn;i++) fac[i] = (fac[i-1]*i) % mod;    inv[maxn-1] = qpow(fac[maxn-1],mod-2);//先求一个最大数的逆元.    for(ll i=maxn-2;i>=0;i--){    //然后根据地推关系进行一波递推.        inv[i] = (inv[i+1]*(i+1) % mod);//初始化每一个阶乘对应   //的逆元. 这个看不太懂就把它写出来就行了. a*a的逆元==1,这样做可   //以把每一个阶乘的逆元给预处理出来.    }}ll C(int n,int m){    return fac[n] * inv[m] % mod * inv[n-m] % mod;}
原创粉丝点击