求神秘做法的复杂度证明

P3290 [SCOI2016] 围棋

下面是核心代码: ```cpp chr C[2][25]; uint Ok[2][531443],Op[25],Nxt[25][3]; uint A[531443],B[531443],Id[1025],Stt[1025],tp,tp2; modint W[1025],Last[1025],Cnt[531443]; typedef std::pair<uint,uint>Pair; int main() { #ifdef MYEE freopen("QAQ.in","r",stdin); #endif uint n,m,c,q;scanf("%u%u%u%u",&n,&m,&c,&q);uint SLim=power(3u,m,-1u); while(q--){ scanf("%s%s",C[0],C[1]); for(uint op=0;op<2;op++){ for(uint i=0;i<c;i++)Op[i]=C[op][i]=='W'?2:(C[op][i]=='B'); for(uint k=0;k<3;k++)Nxt[0][k]=0; Nxt[0][Op[0]]=1; uint j=0; for(uint i=1;i<c;i++){ for(uint k=0;k<3;k++)Nxt[i][k]=Nxt[j][k]; Nxt[i][Op[i]]=i+1,j=Nxt[j][Op[i]]; } for(uint k=0;k<3;k++)Nxt[c][k]=Nxt[j][k]; for(uint S=0;S<SLim;S++) { uint at=0,v=0,T=S; for(uint i=0;i<m;i++)at=Nxt[at][T%3],T/=3,v|=(at==c)<<i; Ok[op][S]=v>>(c-1); } } std::map<Pair,uint>M;std::set<uint>T; for(uint i=0;i<SLim;i++) M[{Ok[0][i],Ok[1][i]}]++,T.insert(Ok[0][i]); T.insert(0); tp=tp2=0; for(auto v:M)A[tp]=v.first.first,B[tp]=v.first.second,Cnt[tp]=v.second,tp++; for(auto v:T)Stt[Id[v]=tp2]=v,W[tp2]=0,tp2++; W[0]=1; modint ans; for(uint cnt=0;cnt<n;cnt++){ for(uint i=0;i<tp2;i++)Last[i]=W[i],W[i]=0; for(uint i=0;i<tp2;i++)for(uint j=0;j<tp;j++){ if(Stt[i]&B[j])ans+=Last[i]*Cnt[j]*(modint(3)^(m*(n-cnt-1))); else W[Id[A[j]]]+=Last[i]*Cnt[j]; } } ans.println(); } return 0; } ```
by myee @ 2022-10-18 14:50:19


@[myee](/user/105050) 数据范围不是明确写出来了?
by SilviaLss @ 2022-10-18 16:17:30


@[Silviasylvia](/user/121275) 看看数据点 $9$。
by myee @ 2022-10-18 17:27:54


$$6^8\times100=167961600>10^8$$
by myee @ 2022-10-18 17:29:31


@[myee](/user/105050) 这年代你还拿 $10^8$ 为界?
by 猫猬兽 @ 2022-10-19 20:34:34


|