洛谷 P10254 口吃
description
求恰有
solution
很重要的一个拆贡献的想法是:一个数
考虑 dp 第一部分的贡献。按照值域从大往小把
具体地,设
有转移:
第二部分贡献同理。
这样就可以时间复杂度
整理一下式子可以发现可以前缀和掉一部分转移。
还有形如
时间复杂度
hint
两部分贡献的 dp 只有
需要滚动数组。
code
#include<bits/stdc++.h> using namespace std; using E=long long; constexpr E mod=998244353; int main(){ #ifdef zzafanti freopen("in.in","r",stdin); #endif // zzafanti cin.tie(nullptr),cout.tie(nullptr)->sync_with_stdio(false); int n,k; cin>>n>>k; E ans=0; vector<vector<E>> f(2,vector<E>(k+1)),g(2,vector<E>(k+1)),sg(2,vector<E>(k+1)),sf(2,vector<E>(k+1)); vector<E> trans(k+1); f[0][0]=1,g[0][0]=0; for(int j=0; j<=k; j++){ sf[0][j]=1; } for(int i=1; i<=n; i++){ for(int j=k; ~j; j--){ trans[j]=(j==k?0:trans[j+1]); trans[j]=(trans[j]+f[i-1&1][j]*(k-j+1))%mod; } for(int j=0; j<=k; j++){ f[i&1][j]=sf[i-1&1][j]; if(j-i>=0) f[i&1][j]-=sf[i-1&1][j-i]; E coef=n+i*i-2*i+1; g[i&1][j]=sg[i-1&1][j]+coef*sf[i-1&1][j]%mod; if(j-i>=0) g[i&1][j]-=sg[i-1&1][j-i]+coef*sf[i-1&1][j-i]; coef=n-2*i+1; E dlt=(j-i+1>=0?trans[j-i+1]:trans[0])-(j<k?trans[j+1]:0)-(k-j)*1ll*(sf[i-1&1][j]-(j-i>=0?sf[i-1&1][j-i]:0)); dlt%=mod; g[i&1][j]=(g[i&1][j]+coef*dlt)%mod; sf[i&1][j]=((j==0?0:sf[i&1][j-1])+f[i&1][j])%mod; sg[i&1][j]=((j==0?0:sg[i&1][j-1])+g[i&1][j])%mod; } } //cout<<(f[n&1][k]%mod+mod)%mod<<endl; cout<<(g[n&1][k]%mod+mod)%mod<<endl; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具