hdoj2048(神、上帝以及老天爺

#include <stdio.h>
int main()
{
    int c,n;
    long long int a[1000];
    long long int b[1000];
    double ans;
    b[1]=1;
    a[2]=1;
    a[3]=2;
    while(scanf("%d",&c)!=EOF)
    {
        while(c--)
        {
            scanf("%d",&n);
          for(int i=4;i<=n;i++)
          {
              a[i]=(i-1)*(a[i-1]+a[i-2]);//拿錯的可能種數
          }
            for (int i=2;i<=n;i++)
            {
                b[i]=b[i-1]*i;//總可能數
            }
            ans=(100.0*a[n])/b[n];
            printf("%.2f%%\n",ans);
        }
    }
    return 0;
}

已AC

a[2],a[3]很容易就能推出來。。。

然後a[4]之後。就像是在編號1-n的盒子中放編號1-n的小球並且小球的編號不能與盒子的編號相等,每增加一個小球,n球不能在n盒,所以之前的盒子中選出一個,可能性是n-1,,假設這個盒子是k,把k球與n球互換,剩下的n-2個球亂排就是a[n-2],所以這一種情況總的可能數是(n-1)*a[n-2] ,如果不把k球放n盒中,即n盒等效爲k盒,那麼剩下的n-1個球亂排,總可能數就是(n-1)*a[n-1],而k球要麼放n盒要麼不放n盒,所以a[n]=n-1*(a[n-1]+a[n-2]),

總可能數很容易推出來是n!。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章