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