王国を歌っLuogu4548
質問表面:Luogu
解決
それは興味深いトピックです。
離散ランダム変数整数を関数を生成するクラス\(T \) 、関数の各項目\(X ^ iは\)係数は、変数の値を表し、(Iは\)\また、確率これは、次のとおりです。
\ [F(X)= \ sum_ {i = 0} ^ {\ inftyの} P(T = I)は、x ^ I \]
この関数は、次のような興味深い特性、多数有している\(= \ 1をF(1))
とのために、\(T \)有することが望ましい:\(E(T)= F「(1)\)。
この質問は作ることになりました\(N- \)アルファベットサイズを表し、\(m個\)は、名前の長さを表しています。
設定考える\(F(X)\)の歌のためにあることを意味\(Iは\)確率生成機能を終了数、\(G(Xは)\)の歌のためのことを意味する\(Iは\)数字ありません関数を生成する確率の終わり。
明らかに、以下の式があります:
\ [XG(X)+ 1 = F(X)+ G(X)\]
これは、文字列の終わりではありませんし、その後の文字に接続され、それが終了したり、終了しない場合があります。
第二に、あります。
\ [G(X)\ビッグ(\ FRAC {1} {n}はX \ビッグ)^ M = \ sum_ {i = 1} ^ {M} A_ {I} F(X)\ビッグ(\ FRAC {1 } {n}はX \ビッグ)^ {MI} \]
それは終わらない名前の文字列の末尾の後に接続され、それは予め、前に終了してもよい\は(A_ {I} = 0/1 \)は、を表し(〔iは、1]の\を \) かどうか文字列\(S \)\(ボーダー\) 。
式及び簡略化の一次導関数があります。
\ [F '(x)=(x-1)G'(x)+ G(X)\]
第2の式で\(X = 1 \)です。
\ [G(1)= \ sum_ {i = 1} ^ {M} A_ {I} N ^ {I} \]
そう:
\ [E(X)= F '(1)= G(1)= \ sum_ {i = 1} ^ m個のA_ {I} N ^ {I} \]
以下のための\(A_ {I} \)、\ (KMP \)しようとします。
コード
#include<cstdio>
#define N 100005
using namespace std;
inline int In(){
char c=getchar(); int x=0,ft=1;
for(;c<'0'||c>'9';c=getchar()) if(c=='-') ft=-1;
for(;c>='0'&&c<='9';c=getchar()) x=x*10+c-'0';
return x*ft;
}
const int P=10000;
int n,T,m,s[N],nex[N],pw[N];
int main(){
n=In(); T=In();
while(T--){
m=In(); for(int i=1;i<=m;++i) s[i]=In();
pw[0]=1; for(int i=1;i<=m;++i) pw[i]=pw[i-1]*n%P;
for(int i=2,j=0;i<=m;++i){
while(j&&s[j+1]!=s[i]) j=nex[j];
if(s[j+1]==s[i]) ++j; nex[i]=j;
}
int sum=0;
for(int i=m;i;i=nex[i]) sum=(sum+pw[i])%P;
printf("%.4d\n",sum);
}
return 0;
}