link:硬幣遊戲
對於100分 我們不難想到這個矩陣過大 且沒有用的節點很多我們最後只要n個節點的答案 其他節點的答案可以不要。
考慮把沒用的節點的答案壓到一點上。相同的套路 我們設f[i]表示經過第i個點的期望次數 由於是到達某個點我們強制停止 所以概率*結果=期望次數。
此時結果為1/0 所以這個期望次數在數值之上和概率是相等的。
對於第i個終止節點來說我們考慮一下這個點的期望次數怎麼求出。
顯然是由非終止節點轉移過來 由於每次翻硬幣只有兩種可能 或者說字符集大小為2 所以轉移過來至少需要m條邊且 概率為\(\frac\)
但是這其中存在一些不合法的情況 如 我們從乙個非法狀態轉移+自身字首狀態的一部分 可能恰好和其他字串是相等的 此時遊戲結束概率也轉移不來。
要把這些情況造成的影響全部減掉 \(f_i=\fracf_0-...\)上面的事情發生在當前字串的字首和其他字串的字尾相等時會發生。
考慮匹配的長度為k 那個點為j 那麼我們要減去 \(\frac}f_j\) 所代表的含義為 前m-k長度的那個點的期望次數為 f_j的期望次數的一部分
於是乎就可以列出n個方程 但是有n+1個未知數 考慮加乙個方程 \(\sum=1\)
寫到這裡我想就很明朗了 很不錯的題目。
這裡使用hash判斷前字尾 注意初始化的問題 我們對於f[i]的單項係數也在判斷前字尾中搞。這樣比較方便不需要特判最後一位什麼的。
而且最後一位也不合法不屬於0號節點裡面 所以可以這樣做 我迷了半天。。
const int maxn=310;
int n,m;
char b[maxn][maxn];
db a[maxn][maxn],p[maxn];
ll pw[maxn],qz[maxn][maxn],hz[maxn][maxn];
inline void gauss()
} rep(0,n,i)a[i][n+1]/=a[i][i];
}int main()
rep(1,n,i)
rep(1,n+1,i)a[0][i]=1;
//rep(0,n,i)\)需要這個概率 而右邊雖然是 \(2^m\)的係數 但是其代表了後來是走到了fj的
而我們的前者則是 固定為fj 所以這兩個東西顯然相等。
又思考了20min 想到了乙個更合理的思路。還是關於式子的問題。
我們考慮 減掉不合法方案 設不合法方案的點 為w 我們其實多加了乙個 \(f_w\frac\) 在左邊減掉其。
首先我們要先走到w這個點 設此匹配長度為k 那麼概率為\(\frac}\) 其期望要再乘上fj。
感覺證明還是很不順暢 先咕了。
luogu3706 硬幣遊戲
可以參考洛谷4548,推導過程較為省略 定義 g 表示隨機 i 次後未出現給定字串的概率,f 表示隨機 i 次後恰好出現 s 指第 k 個字串 的概率,設兩者的生成函式分別為 g x 和 f x 同樣,考慮如何去表示 p 前i個字元中未出現給定字串且最後m個字元為s 1.通過 g 此時即為 frac...
Luogu2157 SDOI2009 學校食堂
link 給定 n 個學生的口味和忍耐度,若前一道菜的對應的口味是a,這一道為b,則做這道菜所需的時間為 a b a b 而做第一道菜是不需要計算時間的.每個學生可以忍耐忍耐度以下的人在他前面插隊買飯 求最小的做飯時間 n le 1000,b i le 8 令 f 表示第 i 個人前面的狀態是 s ...
Luogu5358 SDOI2019 快速查詢
luogu5358 sdoi2019 快速查詢 不敢壓行了,調不動 qaq 注意查詢雜湊表時,如果已經找到了數,但是是在覆蓋以前的,直接返回找不到即可,因為雜湊表的特點是後插入的數先訪問到。include include include define n 100005 define m 105 de...