SDOI2017硬幣遊戲

2022-03-19 20:28:07 字數 1396 閱讀 5866

洛咕神題,幸好我不是sd的qaq。

假設你們都會\(o(n^3m^3)\)的高斯消元,具體來說就是建出\(trie\)圖然後套遊走的板子。

然後我們發現可以把不能匹配任何串的概率壓到一起。

考慮乙個不能匹配任何串的\(s\)。乙個串\(a_i\)獲勝當且僅當最後串是這樣的:\(s+a_i\)。

真的嗎?

如果\(s\)的字尾和\(a_i\)的字首能拼出來\(a_j\)就假掉了。所以神仙們採用了神仙做法。

引用\(kelin\)神犇的例子。

舉個例子設\(a=101,b=110\)。

\(s101=(s+a),(s'+a+01),(s''+b+1)\),其中\(s'+10=s,s''+1=s\)。

上面三種組成方式概率為\(2\)的他們後面串的長度次方,分別是\(1,\frac,\frac\)。

於是乙個上好的方程就列出來了。

\[\fracp_s=(1+\frac)p_a+\fracp_b$$。

由於~~這種辣雞題目你直接消肯定是錯的的定律~~這些方程一定有$n$個可以線性張成另乙個,所以我們還要加上$\sum\limits_^np_i=1$。

畢竟我們什麼都不加的化每個$p_i$擴大相同倍數也是對的qaq。

就醬。```

#include#include#include#define gt getchar()

#define ll long long

#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)

inline int in()

const int n=305,m=1e5+5;

const double eps=1e-10,p=0.5;

int n,m,cnt,ch[m][2],head[m],to[m],nxt[m];

int pos[n],fa[m],sz[m],tot;

double p[n],g[n][n];

char s[n];

inline void add(int u,int v)

#define v (ch[u][i])

inline void insert(int p)

inline void build()

#undef v

inline void calc(int x)

int o[n];

inline void gauss(int n)

o[pos[i]]=1;double t=g[pos[i]][i];

for(int j=1;j<=n+1;++j)g[pos[i]][j]/=t;

for(int k=1;k<=n;++k)

if(pos[i]!=k)

}}int main()

```\]

SDOI2017 硬幣遊戲

考慮生成函式來做 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的字尾是...

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