數學遞推

被機智的逼哥發現後,旋少很不甘心把自己的辛苦的血汗錢發出去,但是又不得不吐出來。於是他打算把這些錢發出去,但是不是簡單的發紅包。
爲了活躍氣氛,他決定這樣發紅包這:

首先,先發一個小紅包(每人一分錢)假設所有人都先後隨機的領取了
然後,他會把紅包的領取時間排序
最後,如果領取時間排序的序號就是AC紅包裏面的排名,那麼“恭喜你,你變成了旋少的有緣人”有緣人會平分得到旋少所有的“血汗錢”。

這活動雖然有趣但是,逼哥眉頭一皺,發現事情並沒有那麼簡單。

他覺得有必要計算一下沒有人成爲旋少有緣人的概率。
Input輸入數據的第一行是一個整數T,表示測試實例的個數,然後是T 行數據,每行包含一個整數n(1<n<=20),表示參加的人數。

Output對於每個測試實例,請輸出沒有人成爲旋少有緣人的概率,每個實例的輸出佔一行, 結果保留兩位小數(四捨五入),具體格式請參照sample output。

Sample Input
1
2
Sample Output
50.00%

這個題爲錯排,有遞推公式,但是好像可以打表然後找規律,但我不會暴力打表,還需努力!

#include<stdio.h>
#include<string.h>
double fun(int n)
{
    double mul=1;
    int i;
    for(i=1;i<=n;i++)
    {
        mul=mul*i;
    }
    return mul;
}//階乘
int main()
{
    int t,i;
    int n;
    long long a[1000];
    scanf("%d",&t);
    a[1]=0;a[2]=1;
    while(t--)
    {
        scanf("%d",&n);
        if(n>=3)                                      //1個人和兩個人沒辦法 用遞推公式
        {
            for(i=3;i<=n;i++)
            {
            a[i]=(i-1)*(a[i-1]+a[i-2]);        //關鍵的遞推公式,假設有n個人,n-1個人全部錯排後,第n個人與前面n-1個人任意交                                                                 換,其結果均錯排,有(n-1)*a[n-1];

                                                             n-2個人全部錯排後,也就是說第n-1個人、第n個人拿的是正確的,那麼只需第n個人與                                                              第n-1交換,有(n-1)*a[n-2];

                                                             所以 a[n]=(n-1)*a[n-1]+(n-1)*a[n-2]
            }
           printf("%.2lf%%\n",(a[i-1]/fun(n))*100);
        }
        else printf("%.2lf%%\n",(a[n]/fun(n))*100);//1個人、2個人時的情況。
    }
    return 0;
}

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