错位排列的魅力

来源:互联网 发布:web前端后端数据交互 编辑:程序博客网 时间:2024/04/27 09:15
错位排列:即n个有编号的人各自抽不中自己的号码
以下证明其公式为:f(n)=(n-1)*(f(n-1)+f(n-2))
首先是第一个人,称为1号
1号不抽取自己,有(n-1)种抽取方法
假设1号抽中2号
有两种情况:1、2号也抽中了1号,于是剩下n-2个自己进行错位排列,得f(n-2)种
2、2号没有抽中1号,则必有后面的抽中1号,于是此时将2号当作1号,即假设后面抽到的1号是2号,于是又有f(n-1)种
所有可以证得<pre name="code" class="cpp">f(n)=(n-1)*(f(n-1)+f(n-2))
以下是一个应用实例:
hd2048,也是递归思想
#include <stdio.h>int main(void){    int n,i,k,l,a;    long long int fb[2],t;    double j;    scanf("%d",&n);    for(k=0;k<n;k++)    {        scanf("%d",&a);        fb[0]=1,fb[1]=2;        for(l=3;l<a;l++)        {            t=fb[1];            fb[1]=(l)*(fb[1]+fb[0]);            fb[0]=t;        }        /*printf("%lld %lld",fb[0],fb[1]);*/        for(i=1,j=1;i<=a;i++)            j*=i;        if(a==1)            printf("%.2f%%\n",100.0);        else if(a<4)            printf("%.2f%%\n",(double)((int)(fb[a-2]/j*10000+0.5))/100);        else            printf("%.2f%%\n",(double)((int)(fb[1]/j*10000+0.5))/100);    }    return 0;}

还有补充一点:

即四舍五入的方法:

(int)(a+0.5)

利用了系统的截断,可以获得四舍五入的数!

1 0
原创粉丝点击