思路
首先,我们可以忽略平局的情况.因为如果我们过滤掉平局的情况,最终结果仍然不变.
我们记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; }