SDOI2017 硬幣遊戲

2022-02-05 07:46:03 字數 2150 閱讀 6613

考慮生成函式來做

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 一下,大力合併就好了,合併直接對位相乘,只需要在...