思路

首先,我们可以忽略平局的情况.因为如果我们过滤掉平局的情况,最终结果仍然不变.

我们记Alice赢的概率为 ,输的概率为 , 当Alice手头有 颗糖果时,最终获胜的概率是 .

然后我们就可以列出转移方程:

很明显这玩意不能直接转移,如果 比较小的时候我们可以高斯消元解方程,但是这题数据范围是,用高斯消元会.

于是我们手动解方程.(滑稽

把每一个表示成的形式.

,因此.

于是我们就可以 推出所有的 了.

因为 ,我们可以倒推出所有的 .

最终答案就是 .注意特判 的情况.

代码

#include<bits/stdc++.h>
using namespace std;
#define i64 long long
#define f80 long double
#define rgt register
#define fp( i, b, e ) for ( int i(b), I(e); i <= I; ++i )
#define fd( i, b, e ) for ( int i(b), I(e); i >= I; --i )
#define go( i, b ) for ( int i(b), v(to[i]); i; v = to[i = nxt[i]] )
template<typename T> inline bool cmax( T &x, T y ){ return x < y ? x = y, 1 : 0; }
template<typename T> inline bool cmin( T &x, T y ){ return y < x ? x = y, 1 : 0; }

int N, l, r, M, L, R;
double p, s, t;

signed main(){
    cin >> N >> l >> r >> M >> L >> R;
    if ( !N ) return printf( "0.00000\n" ), 0;
    fp( i, l, r ) fp( j, L, R )
        s += i != j ? 1 : 0, p += i > j ? 1 : 0;
    p /= s, s = 1, t = 0;
    fp( i, 1, N + M - 1 ){
        t = p / (1 - (1 - p) * t);
        if ( i >= N ) s *= t;
    } printf( "%.5lf\n", s );
    return 0;
}