删除背包,非常的牛。
先转化一下题意,要求深度的和,转化为每种方案这个点祖先的个数加
朴素的就是枚举每个数对
先放区间内的数,那么就会有
然后观察一下可以发现对于
发现每次相当于把原来第
// Problem: P5853 [USACO19DEC] Tree Depth P
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P5853
// Memory Limit: 125 MB
// Time Limit: 1000 ms
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=305;
int dp[3][maxn*maxn],n,m,mod,sum[maxn*maxn];
int f[maxn*maxn],res[maxn];
signed main(){
scanf("%lld %lld %lld",&n,&m,&mod);
dp[0][0]=1;
for(int i=1;i<=n;i++){
int now=(i&1);
dp[now][0]=sum[0]=1;
for(int j=1;j<=m;j++){
sum[j]=(sum[j-1]+dp[now^1][j])%mod;
dp[now][j]=sum[j];
if(j>=i) dp[now][j]=(dp[now][j]-sum[j-i]+mod)%mod;
}
}
for(int t=1;t<n;t++){
for(int i=0;i<=n*(n-1)/2;i++){
sum[i]=dp[n&1][i];
if(i>t) sum[i]=(sum[i]+sum[i-t-1])%mod;
}
f[0]=sum[0];
for(int i=1;i<=n*(n-1)/2;i++) f[i]=(sum[i]-sum[i-1]+mod)%mod;
for(int i=1;i+t<=n;i++){
if(m>=t) res[i]=(res[i]+f[m-t])%mod;
res[i+t]=(res[i+t]+f[m])%mod;
}
}
for(int i=1;i<=n;i++) printf("%lld ",(res[i]+dp[n&1][m])%mod);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话