考慮生成函式來做
g(x)函式就是0+0*x+...+1*x^s+...+|∑|^(n-s)x^n
就是最後s位必須填這個串,但是前面隨便填的方案數
然後列舉之前出現了哪個串(包括自己),如果沒有相交,就是fj(x)*g(x),還有就是有前字尾有相交部分,
pji(x)中的第k位,表示i的長度為m-k的字首和j的長度為m-k的字尾是不是一樣 0/1。
再加上最後乙個
$\sum f_i=1$因為遊戲最終會停止
現在有n+1個方程,g(x)直接當做未知數的話會有交叉項解不出來
把$(1-|\sigma|x)$乘過去,求導來搞搞事情:
由於帶入$x=1/|\sigma|$使得這個$(1-|\sigma|x)$等於0,求導可以消去一些項
$-|\sigma|fi=s(x)^-sx^(\sum_jf_j)-x^s(\sum_jf'_j)+|\sigma|(\sum_jf_jp_)$
把$(\sum_jf'_j)$當做另外乙個未知量
就有n+1個未知量,n+1個方程了
根據「洛必達法則」(一種極限處理)由於最後是收斂的,一定有極限,所以帶入當x=1/|∑|的時候不會除以0成為很大的數(我在口胡)
**:卡精度,不用eps反而更好
//總結:對於連續一些位置有值的時候,luogu-judger-enable-o2
#include#define reg register int
#define il inline
#define ld long double
#define numb (ch^'0')
using
namespace
std;
typedef
long
long
ll;il
void rd(int &x)
namespace
miracle;
const ll jin[2]=;
ll pw[n][2];
ll has[n][n][2];
char
s[n];
ld f[n][n];
ld ans[n];
intn,m;
ld m0,m1;
bool
cmp(ld x)
void guass(int
n)
if(id!=i)
}for(reg j=i+1;j<=n;++j)}}
}for(reg i=n;i>=1;--i)
ans[i]=f[i][n+1]/f[i][i];
}}int
main()
}for(reg i=1;i<=n;++i)}}
m0=m1=1.0
;
for(reg i=1;i<=m;++i) m1=m1*0.5
; m0=m1*2
;
for(reg i=1;i<=n;++i)
tmp*=0.5
; }
//cout<
}f[i][i]-=2.0
; f[i][n+1]=m1;
f[i][n+2]=m*m0;
}for(reg i=1;i<=n;++i)
f[n+1][n+2]=1.0
;
//for(reg i=1;i<=n+1;++i)cout/
} guass(n+1
);
for(reg i=1;i<=n;++i)
return0;
}}signed main()
/*author: *miracle*
date: 2019/2/18 17:41:21
*/
生成函式確實很好用
求導由於可以降次,這裡就把交叉項成功分開了。
ps:這個題也有直接上概率的做法,本質和生成函式相同。但是解釋起來最好的絕對是生成函式
SDOI2017硬幣遊戲
洛咕神題,幸好我不是sd的qaq。假設你們都會 o n 3m 3 的高斯消元,具體來說就是建出 trie 圖然後套遊走的板子。然後我們發現可以把不能匹配任何串的概率壓到一起。考慮乙個不能匹配任何串的 s 乙個串 a i 獲勝當且僅當最後串是這樣的 s a i 真的嗎?如果 s 的字尾和 a i 的字...
SDOI2017 硬幣遊戲 Hash 高斯消元
description 給你乙個字串集,構造乙個串每個位置等概率的插入。問字串集中每個字串最先出現在構造的串中的概率。sample input 3 3tht tthhtt sample output 0.3333333333 0.2500000000 0.4166666667 首先這道題有弱化版,就...
SDOI2017 切樹遊戲
題目 二輪毒瘤題啊 辣雞洛谷竟然有卡樹剖的資料 還是 loj 可愛 首先這道題沒有帶修,設 dp 表示以 i 為最高點的連通塊有多少個異或和為 j g sum dp k in tree i 表示 k 在 i 子樹內部 我們可以直接把每乙個權值 fwt 一下,大力合併就好了,合併直接對位相乘,只需要在...