Link
设(a_i=[ ext{i is a border}])。
令(f_i)为结束时序列长度为(i)的概率,其PGF为(F(x))。
令(g_i)为序列长度达到(i)且尚未结束的概率,其OGF为(G(x))。
分析得到:
[egin{aligned}
F(x)+G(x)&=1+xG(x)\
(frac xn)^LG(x)&=sumlimits_{i=1}^La_iF(x)(frac xn)^{L-i}
end{aligned}
]
推导后得到(ans=F'(1)=sumlimits_{i=1}^La_in^i)。
#include<cctype>
#include<cstdio>
const int N=100007,P=10000;
char ibuf[1<<25|1],*iS=ibuf;int pw[N],s[N],next[N];
int read(){int x=0;while(isspace(*iS))++iS;while(isdigit(*iS))(x*=10)+=*iS++&15;return x;}
int main()
{
fread(ibuf,1,1<<25,stdin);
int n=read(),t=read();
for(int i=pw[0]=1;i<=100000;++i) pw[i]=pw[i-1]*n%P;
while(t--)
{
int m=read(),ans=0;
for(int i=1;i<=m;++i) s[i]=read();
for(int i=2,k;i<=m;next[i]=s[k+1]==s[i]? ++k:k,++i) for(k=next[i-1];k&&s[k+1]^s[i];k=next[k]);
for(int i=m;i;i=next[i]) ans+=pw[i]-P,ans+=ans>>31&P;
printf("%04d
",ans);
}
}