错排问题

来源:互联网 发布:哪里卖淘宝号 编辑:程序博客网 时间:2024/05/14 22:22
#include<stdio.h>
int main()
{
    int i,C,t,n;
    double c,b;
    long long a[21]={0,0,1,2};
    for(i=4;i<=20;i++)
         a[i]=(a[i-1]+a[i-2])*(i-1);
    scanf("%d",&C);
    for(t=1;t<=C;t++)
    {
       scanf("%d",&n);
       for(b=i=1;i<=n;i++)
       {
           b=b*i;
       }
       c=a[n]/b*100;
       printf("%.2lf%%\n",c);
    }
    return 0;

}

错排问题主要是递推关系,首先与百度百科一样,有n个位置放n个数,第n个数可以放在1-n-1这n-1个位置上,设放到k上,则第k个数有两种可能一是放到n上,此时剩下n-2个数,此时重复了最开始的情况只不过n个数变为了n-2,因此这里错排的种数以递推关系表示,不再继续,表示为a[n-2],若k不赋到n上,此时现将k排到第n个数的位置上,第k个位置与第n个数一起拿掉此时有n-1个数,再重复开始时的操作,因此以递推关系a[n-1]表示,则a[n]=(n-1)*(a[n-1]+a[n-2])

容斥法推错排公式仍为理解,需加油。

另外,要输出%,若前面有对变量的格式控制(%d……)则以%%输出,若无则可以%%,\%输出

0 0
原创粉丝点击