hdu2048神、上帝以及老天爷(排错问题)

来源:互联网 发布:电脑培训软件机构咨询 编辑:程序博客网 时间:2024/05/20 02:53

题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2048
题解:
假设共有n个人(n>3);
1.此时我们要注意假设前n-1个人都未拿到自己的名字,此时第n个人来,只要考虑从n-1个人中选一个人与其调换纸条即可,因此可能为(n-1)*f(n-1);
2.假设n-2个人未拿到自己的名字,此时来第n个人,他必然是与第n-1个人进行调换的,而我们需要从n-1个人中选一个作为第n-1个人,因此可能为(n-1)*f(n-2)
综上可能的种类为f(n)=(n-1)*(f(n-1)+f(n-2));而总可能为n!;
AC代码如下:(还需要注意的有一点是如果需要输出%,需要连续打两个%,如果要2个就要连续打4个)

#include <stdio.h> int main(){    long long T,n,i,last,lastlast,now;    scanf("%I64d",&T);    while(T--){        scanf("%I64d",&n);        if(n==2){            printf("50.00%%\n");            continue;        }        if(n==3){            printf("33.33%%\n");            continue;        }        lastlast=1;last=2;        for(i=3;i<n;i++){            now=i*(last+lastlast);            lastlast=last;            last=now;        }        double m=now*1.0;        double s=1;        for(i=1;i<=n;i++){            s*=i;        }        double q=m/s*100;        printf("%.2lf%%\n",q);    }     return 0;}