LG P4548 CTSC2006 歌唱王國

2022-06-12 12:39:08 字數 1758 閱讀 9685

在歌唱王國,所有人的名字都是乙個非空的僅包含整數 $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

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;

}

[ctsc2006]歌唱王國

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 例如 輸入...