更好的阅读体验
题意简述
给出长 m 的不等号序列 s,求长度为 n 的排列 p 个数,使得:
-
对于所有 1≤l<r≤n,r−l>1 且最小值与次小值在区间两端的区间,区间内第三小值为 pl+1 或 pr−1。
-
对于所有 t∈[1,m],若 st=<,则 pt<pt+1;否则 pt>pt+1。
答案对 998244353 取模。
n≤2×105,m≤100。
题目分析
标记记号 check[i,<]=[i>m∨si=′<′],check[i,<]=[i>m∨si=′>′]。
考虑一个序列是否是好的:
于是设计一个区间 DP。设 a∗∗(l,r),a1∗(l,r),a∗1(l,r),a12(l,r),a21(l,r) 分别表示对于区间 (l,r),满足给定条件的「区间两端无限制」,「区间左端点为最小值」,「区间右端点为最小值」,「区间左端点为最小值,右端点为次小值」,「区间左端点为次小值,右端点为最小值」的方案数。于是有:
a∗∗(l,r)=r∑i=la∗1(l,i)a1∗(i,r)(r−li−l)
a1∗(t,t)=1,a1∗(l,r)=r∑i=l+1a12(l,i)a1∗(i,r)(r−l−1i−l−1)
a∗1(t,t)=1,a∗1(l,r)=r−1∑i=la∗1(l,i)a21(i,r)(r−l−1i−l)
a12(t,t+1)=check[t,<],a12(t,t+2)=check[t,<]check[t+1,>],a12(l,r)=check[l,<]a21(l+1,r)+check[r−1,>]a12(l,r−1)
a21(t,t+1)=check[t,>],a21(t,t+2)=check[t,<]check[t+1,>],a21(l,r)=check[l,<]a21(l+1,r)+check[r−1,>]a12(l,r−1)
暴力做时间复杂度 O(n3),无法接受。
答案为 a∗∗(1,n),故要对所有 k∈[k,n] 计算出 a∗1(1,k) 及 a1∗(k,n)。
DP 式为 a∗1(1,1)=1,a∗1(1,k)=k−1∑i=1a∗1(1,i)a21(i,k)(k−2i−1)。
观察到给左右两边的 a∗1 同乘阶乘会使形式简化许多。设 a∗1(1,k)=(k−1)!xk−1,x0=1,则有:
(k−1)!xk−1=k−1∑i=1(i−1)!xi−1a21(i,k)(k−2)!(i−1)!(k−i−1)!
(k−1)xk−1=k−1∑i=1xi−1a21(i,k)1(k−i−1)!
kxk=k∑i=1xi−1a21(i,k+1)1(k−i)!
kxk=k−1∑i=0xia21(i+1,k+1)(k−i−1)!
这个形式很好看,但是 a21(i+1,k+1) 有两个变量而难以处理。
注意到限制只在前 m 位处,故对于 l>m 的状态,其 DP 值只与长度 r−l+1 有关。设 b??(k)=a??(m+1,m+k)。上式就可以改写为:
kxk=k−1∑i=0xib21(k−i+1)(k−i−1)!+min(k−1,m−1)∑i=0xia21(i+1,k+1)−b21(k−i+1)(k−i−1)!
记 ui=b21(i+2)i!,vk−1=min(k−1,m−1)∑i=0xia21(i+1,k+1)−b21(k−i+1)(k−i−1)!。则:
kxk=vk−1+k−1∑i=0xiuk−i−1
写成生成函数就是 X′=V+UX,解这个微分方程得到 X=exp(∫U)[1+∫(Vexp(−∫U))]。
注意到 b21(k)=2k−2+[k=1],对所有 l∈[1,m+1],r∈(l,n] 暴力 DP 出 a21(l,r) 即可得到 b21(k),再对所有 t∈[1,m] 暴力 DP 得到 xt,即可计算 U 与 V。
注意到 k>m 时 a1∗(k,n)=b1∗(n−k+1),考虑先求出 b1∗(k),求出后可对 k∈[1,m] 暴力 DP 出 a1∗(k,n)。
DP 式为 a1∗(n,n)=1,a1∗(k,n)=n∑i=k+1a12(k,i)a1∗(i,n)(n−k−1i−k−1),即:
b1∗(k)=k∑i=2b12(i)b1∗(k−i+1)(k−2i−2)=k−1∑i=1b1∗(i)b12(k−i+1)(k−2i−1)
令 b1∗(k)=(k−1)!yk−1,代入:
(k−1)!yk−1=k−1∑i=1(i−1)!yi−1b12(k−i+1)(k−2)!(i−1)!(k−i−1)!
(k−1)yk−1=k−1∑i=1yi−1b12(k−i+1)(k−i−1)!
kyk=k∑i=1yi−1b12(k−i+2)(k−i)!
kyk=k−1∑i=0yib12(k−i+1)(k−i−1)!=k−1∑i=0yiuk−i−1
于是有 Y′=UY,解得 Y=exp(∫U)。
总时间复杂度 O(n(logn+m))。
代码
| ... |
| long long n,m,ans; |
| char S[N]; |
| bool ck(long long pos,bool id){ |
| if(pos>m) return 1; |
| return id==(S[pos]=='>'); |
| } |
| long long a12[M][O],a21[M][O],a_1[N],a1_[N],b12[N],b21[N],b1_[N]; |
| long long x[N],U[N],V[N],P[N],Q[N],F[N]; |
| |
| int main(){ |
| init(N-5); |
| cin>>n>>m; |
| scanf("\n%s",S+1); |
| for(long long l=1;l<=n;l++){ |
| for(long long i=1;i+l-1<=n && i<=m+1;i++){ |
| long long j=i+l-1; |
| if(j==i+1) a12[i][i+1]=ck(i,0); |
| else if(j==i+2) a12[i][j]=ck(i,0)*ck(j-1,1); |
| else a12[i][j]=(ck(i,0)*((i==m+1)?pw[j-(i+1)-2]:a21[i+1][j])%mod+ck(j-1,1)*a12[i][j-1]%mod)%mod; |
| if(j==i+1) a21[i][i+1]=ck(i,1); |
| else if(j==i+2) a21[i][j]=ck(i,0)*ck(j-1,1); |
| else a21[i][j]=(ck(i,0)*((i==m+1)?pw[j-(i+1)-2]:a21[i+1][j])%mod+ck(j-1,1)*a12[i][j-1]%mod)%mod; |
| } |
| } |
| |
| |
| for(long long i=1;i<=n-m;i++) b12[i]=a12[m+1][m+i],b21[i]=a21[m+1][m+i]; |
| x[0]=1; |
| for(long long i=1;i<=m;i++){ |
| for(long long j=0;j<i;j++) x[i]=(x[i]+x[j]*a21[j+1][i+1]%mod%mod*inv[i-j-1]%mod)%mod; |
| x[i]=x[i]*invv[i]%mod; |
| } |
| |
| |
| for(long long i=0;i<=n+1;i++){ |
| U[i]=b21[i+2]*inv[i]%mod; |
| if(i) for(long long j=0;j<=min(i-1,m-1);j++) |
| V[i-1]=(V[i-1]+x[j]*(a21[j+1][i+1]+mod-b21[i+1-j])%mod*inv[i-j-1]%mod)%mod; |
| } |
| |
| |
| poly::Limit(U,U,n); |
| poly::Exp(P,U,n); |
| INV::solve(Q,P,n); |
| NTT::solve(V,V,Q,n,n); |
| poly::Limit(V,V,n); |
| V[0]=(V[0]+1)%mod; |
| NTT::solve(F,P,V,n,n); |
| |
| |
| for(int i=1;i<=n;i++) a_1[i]=F[i-1]*mul[i-1]%mod,b1_[i]=P[i-1]*mul[i-1]%mod; |
| |
| for(int i=m;i>=1;i--) |
| for(long long t=i+1;t<=n;t++) |
| a1_[i]=(a1_[i]+a12[i][t]*((t>m)?b1_[n-t+1]:a1_[t])%mod*C(n-i-1,t-i-1)%mod)%mod; |
| |
| |
| for(int i=1;i<=n;i++) ans=(ans+a_1[i]*((i>m)?b1_[n-i+1]:a1_[i])%mod*C(n-1,i-1)%mod)%mod; |
| cout<<ans; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】