bzoj4517: [Sdoi2016]排列计数

来源:互联网 发布:知行论坛 编辑:程序博客网 时间:2024/05/27 14:13

f[n]=(f[n-1]*f[n-2])(i-1);
ans=c(n,m)*f[n-m].

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int read(){    char ch=getchar();int f=0;    while(ch<'0'||ch>'9') ch=getchar();    while(ch>='0'&&ch<='9') {f=f*10+(ch^48);ch=getchar();}    return f;}long long f[1000005],p[1000005];const int mod=1000000007;long long ksm(long long x,int y){    long long ret=1;    while(y)    {        if(y&1)        {            ret=(ret*x)%mod;        }        y>>=1;        x=(x*x)%mod;    }    return ret;}long long c(int n,int m){    return ((1ll*p[n]*ksm(p[m],mod-2)%mod)*ksm(p[n-m],mod-2))%mod;}int main(){    int T=read();    f[0]=1,f[2]=1;p[1]=1;p[2]=2;p[0]=1;    for(int i=3;i<=1000000;i++)    {        f[i]=(1LL*(i-1)*(f[i-1]+f[i-2]))%mod;        p[i]=(1LL*p[i-1]*i)%mod;    }    while(T--)    {        int n=read(),m=read();        //cout<<f[n-m]<<" ";        if(m>n)        puts("0");        else        printf("%d\n",(1LL*c(n,m)*f[n-m])%mod);        //cout<<c(n,m);    }}
原创粉丝点击