接着前一篇日志,两道递推题目,主要都是错排公式的运用
/*
HDOJ 2048
先用错排公式求出对应的错排总数,然后再求下对应的百分比
*/
#include <stdio.h>
_int64 fac(int n)
{
if((n == 1) || (n == 0))
return 1;
else
return (n*fac(n-1));
}
int main()
{
_int64 f[21];
int nCase,n,i;
double p;
f[1]=0;
f[2]=1;
for(i=3;i<21;i++)
{
f[i]=(i-1)*(f[i-1]+f[i-2]); //错排公式
}
scanf("%d",&nCase);
while(nCase--)
{
scanf("%d",&n);
p=double(f[n])/fac(n)*100;
printf("%.2f%%\n",p);
}
return 0;
}
HDOJ 2049 考新郎
/*
HDOJ 2049
排列组合+错排
*/
#include <stdio.h>
int main()
{
_int64 f[21],fac[21];
int n,m,i,nCase;
f[0]=0;
f[1]=0;
f[2]=1;
fac[0]=1;
fac[1]=1;
fac[2]=2;
for(i=3;i<21;i++)
{
//计算 i!
fac[i]=fac[i-1]*i;
//错排
f[i]=(i-1)*(f[i-1]+f[i-2]);
}
scanf("%d",&nCase);
while(nCase--)
{
scanf("%d%d",&n,&m);
if(n == m)
printf("%I64d\n",f[m]);
else
printf("%I64d\n",fac[n]/fac[m]/fac[n-m]*f[m]);
}
return 0;
}