爲了活躍氣氛,他決定這樣發紅包這:
首先,先發一個小紅包(每人一分錢)假設所有人都先後隨機的領取了
然後,他會把紅包的領取時間排序
最後,如果領取時間排序的序號就是AC紅包裏面的排名,那麼“恭喜你,你變成了旋少的有緣人”有緣人會平分得到旋少所有的“血汗錢”。
這活動雖然有趣但是,逼哥眉頭一皺,發現事情並沒有那麼簡單。
他覺得有必要計算一下沒有人成爲旋少有緣人的概率。
Output對於每個測試實例,請輸出沒有人成爲旋少有緣人的概率,每個實例的輸出佔一行, 結果保留兩位小數(四捨五入),具體格式請參照sample output。
Sample Input
1 2Sample 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;
}