#include #include #include #include #include #include using namespace std; typedef long long LL; const LL PP=1000000007; const int P=10007; struct Node { int len; int va[12]; }; LL dp[2][110000]; Node ST[2][110000]; struct Edge{int ne,id;Node st;}e[110000]; int p[P+10],mod[P+10],Hashnum; void Hashinit() { memset(p,-1,sizeof(p)); memset(mod,0,sizeof(mod)); Hashnum=0; } int find(Node st,int re) { if(mod[re]) { for(int i=p[re];i!=-1;i=e[i].ne) { if(e[i].st.len!=st.len)continue; for(int j=0;jnum[id]) { ST[id][tt].len=st.len; for(int i=0;ik;l--) { if(ts.va[l-1]!=0)tt.va[l]=(ts.va[l-1]+1)%(K+1); else tt.va[l]=0; } tt.len=ts.len+1;po=1; for(l=1;l<=ts.len;l++) { if(tt.va[l]==0&tt.va[po-1]==0)continue; else tt.va[po++]=tt.va[l]; } tt.len=po; add(tt,dp[fl][j],te); } } fl=te; } LL ans=0; for(i=0;i