#include <stdio.h>
long long int fact(int n)
{
long long int s=1;
if(n==0)
s=1;
else
{
for(int i=1;i<=n;i++)
{
s*=i;
}
}
return s;
}
int main()
{
int n,m,c;
long long int s,ans;
long long int a[1000];
a[2]=1;
a[3]=2;
while(scanf("%d",&c)!=EOF)
{
while(c--)
{
scanf("%d%d",&n,&m);
for(int i=4;i<=m;i++)
{
a[i]=(i-1)*(a[i-1]+a[i-2]);
}
s=fact(n)/(fact(m)*fact(n-m));
//printf("\"%lld\n",s);
ans=s*a[m];
printf("%lld\n",ans);
}
}
return 0;
}
已AC
其实这题跟上一题的错排差不多 ,有n对新人,m个新郎找不到,那么就是m对新人的错排,先n中要选出是哪m对新人错了,所以有组合数C(n,m),总可能数就是m个新人错排的可能数乘以组合数C(n,m)
值得注意的是不管是阶乘还是之后的错排可能数都要用long long int。。。不然会WA的。。。。
错排问题与组合数算法
599

被折叠的 条评论
为什么被折叠?



