当前位置: 首页 > news >正文

[AGC043D] Merge Triplets

题目传送门

很有意思的计数题

解法

考虑经过操作后得到的排列的性质


性质1:
p r e ( i ) pre(i) pre(i):前i个位置的最大值,则不会出现超过3个的连续位置的 p r e pre pre相同
必要性
考虑反证,若有超过 3 3 3个的连续位置的 p r e pre pre相同,那么至少有连续有连续三次选择了比第一次选择要小的数,那么至少一个块的长度为 4 4 4,题目中规定块长为 3 3 3,因此不合法
充分性
发现没有充分性,比如: { 2 , 1 , 4 , 3 , 6 , 5 } \{2,1,4,3,6,5\} {2,1,4,3,6,5},手玩模拟一下就会发现有问题
性质2
若排列总长为 3 N 3N 3N, i i i个的连续位置的 p r e pre pre相同的个数为 c n t i cnt_i cnti,那么 c n t 2 ≤ N − c n t 3 cnt_2\le N-cnt_3 cnt2Ncnt3
必要性
对于 c n t 2 cnt_2 cnt2 c n t 3 cnt_3 cnt3来说,他们对应的块内的大小关系是一定的,所以可得 c n t 2 + c n t 3 ≤ N cnt_2+cnt_3\le N cnt2+cnt3N,移项就行了
我们可以化简:
c n t 2 ≤ N − c n t 3 ⇒ 3 c n t 2 ≤ 3 N − 3 c n t 3 ⇒ 3 c n t 2 ≤ ( c n t 1 + 2 c n t 2 + 3 c n t 3 ) − 3 c n t 3 ⇒ 移项得 c n t 2 ≤ c n t 1 \begin{aligned} &cnt_2\le N-cnt_3\\ \Rightarrow&3cnt_2\le 3N-3cnt_3\\ \Rightarrow&3cnt_2\le (cnt_1+2cnt_2+3cnt_3)-3cnt_3\\ \Rightarrow^{移项得}&cnt_2\le cnt_1 \end{aligned} 移项得cnt2Ncnt33cnt23N3cnt33cnt2(cnt1+2cnt2+3cnt3)3cnt3cnt2cnt1

最后我们发现性质1性质2加起来就有了充分性


状态设计:

f i , j : 前 i 个数, c n t 1 − c n t 2 = j 的方案数 f_{i,j}:前i个数,cnt_1-cnt_2=j的方案数 fi,j:i个数,cnt1cnt2=j的方案数
显然 a n s = ∑ k = 0 3 n f 3 n , k ans=\sum_{k=0}^{3n} f_{3n,k} ans=k=03nf3n,k

状态转移:

考虑从小到大放数,对放 1 / 2 / 3 1/2/3 1/2/3个数分别考虑
f i , j → f i + 1 , j + 1 f i , j → f i + 2 , j − 1 ∗ ( i − 1 ) f i , j → f i + 3 , j ∗ ( i − 1 ) ∗ ( i − 2 ) \begin{aligned} &f_{i,j}\to f_{i+1,j+1}\\ &f_{i,j}\to f_{i+2,j-1}*(i-1)\\ &f_{i,j}\to f_{i+3,j}*(i-1)*(i-2) \end{aligned} fi,jfi+1j+1fi,jfi+2,j1(i1)fi,jfi+3j(i1)(i2)
就好了

code:

#include<bits/stdc++.h>
using namespace std;
const int N = 2e3 + 7, M = N * 3;
typedef long long ll;
int n,mod,ans;
int f[M][M<<1];
int ad(int x,int y){ return (1ll*x+1ll*y)%mod; }
void work(int i,int j){f[i+1][j+1+M]=ad(f[i+1][j+1+M],f[i][j+M]);f[i+2][j-1+M]=ad(f[i+2][j-1+M],1ll*f[i][j+M]*(i+1)%mod);f[i+3][j+M]=ad(f[i+3][j+M],1ll*f[i][j+M]*(i+1)%mod*(i+2)%mod);
}
int main() {scanf("%d%d",&n,&mod); n=n*3;f[0][M]=1;for(int i=0;i<n;i++) for(int j=-i;j<=i;j++) work(i,j);for(int i=0;i<=n;i++) ans=ad(ans,f[n][i+M]);printf("%d\n",ans);
}

TXL

http://www.lryc.cn/news/153642.html

相关文章:

  • 2023年人工智能开源项目前20名
  • ThinkPHP 集成 jwt 技术 token 验证
  • gerrit 如何提交进行review
  • 罗勇军 →《算法竞赛·快冲300题》每日一题:“游泳” ← DFS+剪枝
  • 【教程】PyTorch Timer计时器
  • 因果推断(六)基于微软框架dowhy的因果推断
  • 探索隧道ip如何助力爬虫应用
  • 题目:2629.复合函数
  • 【实训项目】精点考研
  • 软件测试Pytest实现接口自动化应该如何在用例执行后打印日志到日志目录生成日志文件?
  • 深入理解作用域、作用域链和闭包
  • 7款适合3D建模和渲染的GPU推荐
  • 边缘计算物联网网关在机械加工行业的应用及作用分享
  • (笔记六)利用opencv进行图像滤波
  • WPF C# .NET7 基础学习
  • QT里使用sqlite的问题,好多坑
  • openGauss学习笔记-59 openGauss 数据库管理-相关概念介绍
  • Nginx安装与部署
  • Linux中Tomcat发布war包后无法正常访问非静态资源
  • 大数据、AI和云原生:引领未来软件开发的技术演进
  • Text-to-SQL小白入门(四)指令进化大模型WizardLM
  • 浅谈红队资产信息收集经验
  • list根据对象中某个字段属性去重Java流实现
  • 软件架构设计(三) B/S架构风格-层次架构(一)
  • 大端字节和小端字节
  • (10)(10.8) 固件下载
  • vue实现列表自动滚动效果
  • 如何通过构建遥感光谱反射信号与地表参数之间的关系模型来准确估算植被参数?植被参数光学遥感反演方法(Python)及遥感与生态模型数据同化算法
  • 持续集成与持续交付(CI/CD):探讨在云计算中实现快速软件交付的最佳实践
  • 【LeetCode题目详解】第九章 动态规划part02 62.不同路径 63. 不同路径 II day39补