#include<stdio.h>
int main()
{
int N,M,C,i,t;
scanf("%d",&C);
for(i=1;i<=C;i++)
{
scanf("%d%d",&N,&M);
long long f[21]={0,0,1},a,b,c;
for(t=3;t<=M;t++)
{
f[t]=(t-1)*(f[t-1]+f[t-2]);
}
for(a=b=t=1;t<=M;N--,t++)
{
a=a*N;b=b*t;
}
c=a/b;
f[M]=f[M]*c;
printf("%I64d\n",f[M]);
}
return 0;
}
这道2049题想通了就还好,拆分为两部走,一是从N个数里选M个,而是M个数排错;这样问题就简化很多了,不过坑爹的是在a/b求排列组合的时候,若a,b为整型则会发生溢出,超过四个字节,主要使用longlong
int main()
{
int N,M,C,i,t;
scanf("%d",&C);
for(i=1;i<=C;i++)
{
scanf("%d%d",&N,&M);
long long f[21]={0,0,1},a,b,c;
for(t=3;t<=M;t++)
{
f[t]=(t-1)*(f[t-1]+f[t-2]);
}
for(a=b=t=1;t<=M;N--,t++)
{
a=a*N;b=b*t;
}
c=a/b;
f[M]=f[M]*c;
printf("%I64d\n",f[M]);
}
return 0;
}
这道2049题想通了就还好,拆分为两部走,一是从N个数里选M个,而是M个数排错;这样问题就简化很多了,不过坑爹的是在a/b求排列组合的时候,若a,b为整型则会发生溢出,超过四个字节,主要使用longlong