AGC043D-Merge-Triplets题解
题意:有
的正整数,不重不漏地划分到 个栈内,每个栈有 个元素。每次从所有栈顶中选择最小的元素取出,直至取完,每次取的元素生成了一个 的排列,求该排列的方案数。
考虑排列应该长什么样。从左往右考虑不好考虑,因为没法确定一开始选什么元素,所以可以从右往左考虑。注意到,最大的元素
一个非常重要的性质为,最大的元素
这个 DP 其实是不对的,因为并不是任意分组都可以有解,还要让这些分组必须能完整地放到
为了防止下标出现负数,可以往正方向平移
By cxm1024
#include<bits/stdc++.h>
using namespace std;
int n,mod,f[6010][15010];
signed main() {
cin>>n>>mod;
f[n*3][n*2]=1;
for(int i=n*3;i>0;i--)
for(int j=0;j<=n*5;j++) {
if(i>=3) (f[i-3][j]+=1ll*f[i][j]*(i-1)*(i-2)%mod)%=mod;
if(i>=2) (f[i-2][j-1]+=1ll*f[i][j]*(i-1)%mod)%=mod;
(f[i-1][j+1]+=f[i][j])%=mod;
}
int ans=0;
for(int i=n*2;i<=n*5;i++)
(ans+=f[0][i])%=mod;
cout<<ans<<endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步