J-Melborp Elcissalc
题意
有一个长度为
的序列,每个位置可以填 到 之间的一个数,求有多少种构造序列的方式,使得构造出来的序列恰有 个连续子段满足和可以被 整除
题解
本题的关键是要想到区间
给定一个确定的序列,求序列有多少连续子段和可以被
设
基于以上分析,设
注意边界的初始值,注意这题组合数比较小,可以预处理存下来,转移时进行适当剪枝,就可以通过极限数据
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=70,mod=998244353;
ll n,m,t,f[N][N][N*N];
ll C[N][N];
void init(){
ll i,j;
C[0][0]=1;
for(i=1;i<=64;++i){
for(j=0;j<=i;++j){
C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
}
}
}
int main(){
init();
ll i,j,k,l;
scanf("%lld%lld%lld",&n,&m,&t);
for(i=1;i<=n;++i){
f[0][i][i*(i+1)/2]=1;
}
for(i=0;i<=m-1;++i){
f[i][1][0]=i,f[i][1][1]=1;
}
for(i=0;i<=m-1;++i){
f[i][0][0]=1;
}
for(i=1;i<=m-1;++i){
for(j=2;j<=n;++j){
for(k=0;k<=min(t,j*(j+1)/2);++k){
for(l=0;l<=j;++l){
if(k<C[l][2]) continue;
f[i][j][k]=(f[i][j][k]+C[j][l]*f[i-1][j-l][k-C[l][2]])%mod;
}
}
}
}
printf("%lld\n",f[m-1][n][t]);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构