题意:

飞机出发时有n个座位,一共n个人,Duha编号为1,每个人都有自己的编号,上飞机按照编号从小到大,Duha会随便选一个位置,后面的人如果发现自己的座位被选也会随机选其他座位,如果自己的座位没被选就会坐到自己的位置,问最后一个人做到自己座位的概率
飞机回来时有m个座位,一共m个人,这次不按照顺序上飞机,且每个人都会选自己的座位坐下,但是Duha会随机选,问最后一个人做到自己座位的概率

题解:

数学概率问题
官网题解
图片说明
第一种情况好解释:
如果第一人坐在1上,后面人都会坐对
如果第一人做到n上,那么n肯定不能坐对
当1做到k上,2k-1肯定会坐对,因为他们的位置没被占,而第k个人会做其他位置上,此时的第k人就相当于一开始第1人一样,总人数变为n-k+1,然后依次这样
1会坐1
n中任意一个
所以Fn=(1+F2...Fn-1)/ n
所以Fn=1/2
这个题解的解释也非常好
第二种情况:
Duha第i个上,那么前i-1个人的位置肯定是对的,相当于人数变成n-i+1
Duha上机顺序是等概率随机的
概率为:Gn=(F1+F2....+Fn)/n=(n+1)/(2n)
这东西真的要比赛时自己推才行。。。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    int Case =1;
    while(t--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        printf("Case #%d: %.6lf %.6lf\n",Case++,n==1?1:0.5,m==1?1:1.0*(m+1)/2/m);
    }
    return 0;
}