您的位置:首页 > 其它

bzoj4517: [Sdoi2016]排列计数

2017-09-03 19:20 435 查看
f
=(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
*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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: