在歌唱王國,所有人的名字都是乙個非空的僅包含整數 $1\sim n$ 的字串。
王國裡生活著一大群咕嚕兵,他們靠不停地歌唱首領——牛人酋長們的名字來獲取力量。咕嚕兵每一次歌唱過程是這樣的:首先,他從整數生成器那兒獲得乙個數字,然後花乙個時間單位將此數字唱出來,如果他發現某個牛人酋長的名字已經被歌唱出來(即此名字是歌唱序列的乙個連續子串),那麼這次歌唱過程就立即結束。
歌唱時間是隨機的,無法預料;不過歌唱時間的期望值是固定的,此期望值即平均來說歌唱時間有多長,亦可稱作平均歌唱時間。
王國裡的人非常喜歡歌唱,他們希望歌唱的時間越長越好,所以他們決定罷免一些牛人酋長,使得平均歌唱時間變長。但是他們不能罷免掉所有的牛人酋長,否則他們每次歌唱都無法停止,無法獲取力量;於是他們決定只保留乙個牛人酋長而罷免其餘的牛人酋長。
你的任務是:對於給定的 $n$、牛人酋長的個數 $t$ 以及每乙個牛人酋長的名字,告訴王國裡的人們,對於 $1\leq i\leq t$,如果保留第 $i$ 個牛人酋長,罷免掉其餘的,那麼平均歌唱時間將是多少。
輸出要求:由於這個數字太大,所以你只需輸出這個數的末 $4$ 位數字。如果不足 $4$ 位,則前面補 $0$
設$f_x$為長度為$x$時成功匹配的概率,$g_x$為長度為$x$時尚未成功匹配的概率
寫出$f$的概率生成函式
$$f(x)=\sum_^ p_i x_i$$
同樣的寫出$g$的
發現$f(1)=1,f'(1)=e(x),f(x)+g(x)=g(x)x+1$
上式的意義類似於dp轉移
還有一關係式,設$m$為字符集大小,$l$為字串長度,$a$是該位是否為border的布林陣列
$$\left ( \frac \right ) ^lg_x =\sum _^l a_i\left ( \frac \right )^f_ $$
考慮在沒有完成匹配的字串後面接乙個隨機出乙個原串的概率,右半部分是有可能產生原串的border導致提前匹配
寫成生成函式的形式
$$\left ( \frac \right ) ^lg(x) =f(x)\sum _^l a_i \left ( \frac \right ) ^$$
對一式求導得
$$f'(x)+g'(x)=xg'(x)+g(x)$$
移項得$$f'(x)=(x-1)g'(x)+g(x)$$
將$1$代入$x$
$$f'(1)=g(1)=e(x)$$
這非常屌,再搞另乙個式子,已經知道要算$g(1)$,所以也代入$1$
$$g(1)=\sum_^l a_im^i$$
kmp或者hash胡搞,$o(l)$求解
#include#include[ctsc2006]歌唱王國using
namespace
std;
intn,t,m;
bool a[100005
];unsigned
long
long b[100005]=,str[100005],has[100005],pn[100005]=,ans;
const unsigned long
long mod=10000,base=1e9+7
;inline
intread()
while(ch>='
0'&&ch<='
9') w=(w<<1)+(w<<3)+ch-'
0',ch=getchar();
return f*w;
}int
main()
return0;
}
454 四數相加 Leetcode
給定四個包含整數的陣列列表 a b c d 計算有多少個元組 i,j,k,l 使得 a i b j c k d l 0。為了使問題簡單化,所有的 a,b,c,d 具有相同的長度 n,且 0 n 500 所有整數的範圍在 228 到 228 1 之間,最終結果不會超過 231 1 例如 輸入 a 1,...
454 四數相加II
給定四個包含整數的陣列列表 a b c d 計算有多少個元組 i,j,k,l 使得 a i b j c k d l 0。為了使問題簡單化,所有的 a,b,c,d 具有相同的長度 n,且 0 n 500 所有整數的範圍在 228 到 228 1 之間,最終結果不會超過 231 1 例如 輸入 a 1,...
454 四數相加 II
題目描述 給定四個包含整數的陣列列表 a b c d 計算有多少個元組 i,j,k,l 使得 a i b j c k d l 0。為了使問題簡單化,所有的 a,b,c,d 具有相同的長度 n,且 0 n 500 所有整數的範圍在 228 到 228 1 之間,最終結果不會超過 231 1 例如 輸入...