杭电2048(c语言)题解
这是一道错排题
错排公式:D(M)=(M-1)*(D[M-1+D[M-2])
思路
用错排除以总的可能数
代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,i;
int a;
scanf("%d",&n);
while(n--)
{
long long int d[24]={0,0,1,2},c=2;
scanf("%d",&a);
for(i=3;i<=a;i++)
{
d[i]=(i-1)*(d[i-1]+d[i-2]);//错排
c=c*i;//总的可能数
}
printf("%.2f%%\n",d[a]*100.0/c);
}
return 0;
}
注意事项
c(总共的可能性)一定定义long long
i要从3开始(一开始我是从2开始的,结果老是不对)
若有更好的解法,或者更简洁的解法,还请大佬多多指教。