2023牛客多校第三场 B.Auspiciousness

传送门

前题提要:没得说,赛时根本没想到dp,赛后翻各大题解看了很久,终于懂了dp的做法,故准备写一篇题解.

首先,先定义一下我们的 d p dp dp方程,考虑将处于 [ 1 , n ] [1,n] [1,n]的数当做小数,将处于 [ n + 1 , 2 ∗ n ] [n+1,2*n] [n+1,2n]的数当做大数.那么对于我们的摸牌结果来说,必然是小数的递增序列+大数的下降序列相交换的形式(例如n=5,[1,2,3,7,6])
那么我们可以得出一个 d p dp dp方程,我们设 d p [ i ] [ j ] [ 0 / 1 ] dp[i][j][0/1] dp[i][j][0/1]当前摸到的牌中有 i i i段是小数序列,有 j j j段是大数序列,并且最后一段是大数/小数序列(0代表小数,1代表大数)的方案数.

此时考虑递推,对于每一个 [ i , j ] [i,j] [i,j]的状态,都可以通过上一次摸牌转移过来:
d p [ i ] [ j ] [ 0 ] = ∑ k = 1 i d p [ i − k ] [ j ] [ 1 ] ∗ C [ n − ( i − k ) ] [ k ] dp[i][j][0]=\sum_{k=1}^{i}dp[i-k][j][1]*C[n-(i-k)][k] dp[i][j][0]=k=1idp[ik][j][1]C[n(ik)][k]简单解释一下上述的递推式的意义.对于当前的状态,如果最后是小数序列,那么因为整个是大数与小数相交换的,所以上一次的状态必然是大数状态,并且此时我们从小数的堆中挑了 k k k个数加入到我们的手牌中,因为上一次状态小数的总个数是 n − ( i − k ) n-(i-k) n(ik),所以不难使用组合数得出上式.
类似的我们有:
d [ i ] [ j ] [ 1 ] = ∑ k = 1 j d p [ i ] [ j − k ] [ 0 ] ∗ C [ n − ( j − k ) ] [ k ] d[i][j][1]=\sum_{k=1}^{j}dp[i][j-k][0]*C[n-(j-k)][k] d[i][j][1]=k=1jdp[i][jk][0]C[n(jk)][k]显然的,上面的递推式并没有完全解决我们的问题.因为我们的问题是总的摸牌数.上面求出的单单只是当前摸到某个状态的牌的方案数.那么对于每一次摸牌的结果,也就是每一个 d p [ i ] [ j ] [ 0 / 1 ] dp[i][j][0/1] dp[i][j][0/1]的状态,其实都是我们的答案.想象一下每一次状态其实我们都可以是一次技能的结束,也就是每一次状态我们都可能都止步于此.那么此时我们需要考虑的就是对于每一个状态我们停止的方案数.因为显然的,每一个状态我们有可能停止也有可能继续

在这里插入图片描述
考虑如上图的状态(分成三段),也就是 ( i + j − k − > i + j ) (i+j-k->i+j) (i+jk>i+j)产生的方案数.不妨假设我们摸的 k k k是小数序列(大数与之类似)
因为我们需要恰好在摸完 k k k之后停止,那么说明我们的 k k k并不是一个完全递增序列,也就是最后一张牌比前面那张小.那么此时我们只有 k − 1 k-1 k1中方案.就比如摸到了 1 , 2 , 3 , 4 1,2,3,4 1,2,3,4,那么此时会停止的状态只有 1 , 2 , 4 , 3 ∣ 1 , 3 , 4 , 2 ∣ 2 , 3 , 4 , 1 1,2,4,3\;|\;1,3,4,2\;|\;2,3,4,1 1,2,4,31,3,4,22,3,4,1(注意我们除了最后一位需要保证递增,因为需要保证摸完k张牌).并且此时对于后面的所有剩下来的 2 n − i − j 2n-i-j 2nij张没摸的牌来说,此时是可以随意摆放的(注意,我们是最终是所有的可能性的总和,所以即使牌没摸,但是不同摆放依旧算一种).所以此时的方案数乘上 ( 2 n − i − j ) ! (2n-i-j)! (2nij)!.然后我们需要的是总的摸牌数,那么对于每一个状态,我们都乘上该状态摸到的牌数,也就是 i + j i+j i+j
所以此时的方案数就是(状态是 [ i , j , 0 ] [i,j,0] [i,j,0]): d p [ i − k ] [ j ] [ 1 ] ∗ c [ n − ( i − k ) ] [ k ] ∗ ( k − 1 ) ∗ f a c [ 2 ∗ n − ( i + j ) ] ∗ ( i + j ) dp[i-k][j][1]*c[n-(i-k)][k]*(k-1)*fac[2*n-(i+j)]*(i+j) dp[ik][j][1]c[n(ik)][k](k1)fac[2n(i+j)](i+j)类似的,假如最后的序列是大数,那么方案数就是(状态是 [ i , j , 1 ] [i,j,1] [i,j,1]): d p [ i ] [ j − k ] [ 0 ] ∗ c [ n − ( j − k ) ] [ k ] ∗ ( k − 1 ) ∗ f a c [ 2 ∗ n − ( i + j ) ] ∗ ( i + j ) dp[i][j-k][0]*c[n-(j-k)][k]*(k-1)*fac[2*n-(i+j)]*(i+j) dp[i][jk][0]c[n(jk)][k](k1)fac[2n(i+j)](i+j)

因为模数不确定,也就是不一定是素数,可能没有逆元,所以需要预处理组合数

至此,本题结束


下面是具体的代码部分:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define root 1,n,1
#define ls rt<<1
#define rs rt<<1|1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {ll x=0,w=1;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x*w;
}
inline void print(__int128 x){if(x<0) {putchar('-');x=-x;}if(x>9) print(x/10);putchar(x%10+'0');
}
#define maxn 1000000
#define int long long
const double eps=1e-8;
#define	int_INF 0x3f3f3f3f
#define ll_INF 0x3f3f3f3f3f3f3f3f
int c[610][610];int n,mod;int fac[maxn];
int dp[610][610][2];//i个小数,j个大数,k=0代表末尾小,1代表末尾大
void init() {for(int i=0;i<=2*n;i++) {for(int j=0;j<=2*n;j++) {dp[i][j][0]=dp[i][j][1]=0;}}c[0][0]=1;for(int i=1;i<=2*n;i++) {c[i][0]=1;for(int j=1;j<=i;j++){c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;}}fac[0]=1;for(int i=1;i<=2*n;i++) fac[i]=fac[i-1]*i%mod;
}
signed main() {int T=read();while(T--) {n=read();mod=read();init();int ans=0;dp[0][0][0]=dp[0][0][1]=1;for(int i=0;i<=n;i++) {for(int j=0;j<=n;j++) {for(int k=1;k<=i;k++) {dp[i][j][0]+=dp[i-k][j][1]*c[n-(i-k)][k]%mod;dp[i][j][0]%=mod;ans+=dp[i-k][j][1]*c[n-(i-k)][k]%mod*(k-1)%mod*fac[2*n-(i+j)]%mod*(i+j)%mod;ans%=mod;}for(int k=1;k<=j;k++) {dp[i][j][1]+=dp[i][j-k][0]*c[n-(j-k)][k]%mod;dp[i][j][1]%=mod;ans+=dp[i][j-k][0]*c[n-(j-k)][k]%mod*(k-1)%mod*fac[2*n-(i+j)]%mod*(i+j)%mod;ans%=mod;}}}ans+=(dp[n][n][0]+dp[n][n][1])%mod*2*n%mod;ans%=mod;cout<<ans<<endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/12367.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CEC2022代码(Matlab代码)及多种智能优化算法求解CEC2022

一、CEC2022测试函数 CEC2022测试集共有12个单目标测试函数&#xff0c;每个测试函数可选择的维度分别为10维、20维。该测试集合也是目前高质量论文应用最广泛的测试集&#xff0c;CEC2022测试集函数复杂&#xff0c;非常具有挑战力。 CEC2022测试函数与理论最优值 二、多种智…

hcip——ospf综合

要求 1. 搭建toop 2.地址规划 协议范围路由器地址 RIP 172.16.0.0 17 R12 loop0&#xff1a;172.16.0.0 24 loop1&#xff1a;172.16.1.0 24 OSPF 172.16.128.0 17 area1 172.16.144.0 20 R1 g0:172.16.144.1 24 loop0:172.16.145.1 24 R2 g0:172.16.144.2 24 loop:172…

微信小程序:实现提示窗确定,取消执行不同操作(消息提示确认取消)showModal

效果 代码 wx.showModal({title: 提示,content: 是否确认退出,success: function (res) {if (res.confirm) {console.log(用户点击确定)} else if (res.cancel) {console.log(用户点击取消)}}})

常用css 笔记

0、定义变量 :root { --primary-color: #007bff;} .button { background-color: var(--primary-color);} 1、水平垂直居中 div {width: 100px;height: 100px;position: absolute;top: 0;right: 0;bottom: 0;left: 0;margin: auto; }父级控制子集居中 .parent {display: fle…

【广州华锐互动】VR模拟灭火逃生体验系统

VR模拟灭火逃生体验系统由广州华锐互动开发&#xff0c;是一种基于虚拟现实技术的应急演练与培训系统&#xff0c;可以真实模拟消防逃生场景&#xff0c;让体验者在沉浸式的虚拟环境中&#xff0c;根据正确的消防逃生方法提示&#xff0c;进行自救演练。这种科学普及方法是更加…

【线程安全的讨论(一)】CPU多核缓存架构和JMM

CPU多核缓存架构 一、CPU多核缓存架构可见性问题乱序执行&#xff08;指令重排&#xff09; 二、JMM——Java内存模型 一、CPU多核缓存架构 计算机的基本组成图 CPU 缓存为了提高程序运行的性能&#xff0c;现代 CPU 在很多方面会对程序进行优化。CPU 的处理速度很快&#xf…

ICMP隐蔽隧道攻击分析与检测

• ICMP隧道攻击工具特征分析 一、原理 由于ICMP报文自身可以携带数据&#xff0c;而且ICMP报文是由系统内核处理的&#xff0c;不占用任何端口&#xff0c;因此具有很高的隐蔽性。 通过改变操作系统默认填充的Data&#xff0c;替换成自己构造的数据&#xff0c;这就是ICMP隐…

simulink与遗传算法结合求解TSP问题

前言&#xff1a;刚开始入门学习simulink&#xff0c;了解了基本的模块功能后想尝试从自己熟悉的领域入手&#xff0c;自己出题使用simulink搭建模型。选择的是TSP问题的遗传算法&#xff0c;考虑如何用simulink建模思想来实现一个简单TSP问题的遗传算法。 TSP问题描述 一个配…

【深度学习】基于图形的机器学习:概述

一、说明 图神经网络&#xff08;GNN&#xff09;在数据科学和机器学习中越来越受到关注&#xff0c;但在专家圈之外仍然知之甚少。为了掌握这种令人兴奋的方法&#xff0c;我们必须从更广泛的图形机器学习&#xff08;GML&#xff09;领域开始。许多在线资源谈论GNN和GML&…

SSIS对SQL Server向Mysql数据转发表数据 (一)

开发工具 Visual Stuido 2019 、SSIS、SQL Server 2016、Mysql 8.0.30 1、配置VS2019的添加相应的功能&#xff0c;勾选SQL Server Data Tools,下载就行我用的VS2019版本还需要下载下面几个插件&#xff0c;链接我放在下面了 Microsoft Analysis Services Projects - Visual St…

CSS伪元素详解以及伪元素与伪类的区别

伪元素常常被误解为伪类&#xff0c;主要在于他们的语法相似&#xff0c;都是对于选择器功能的扩展&#xff0c;相似程度很高导致被混淆。 本文通过详细介绍伪元素和常见的使用方法&#xff0c;最后也会分析下伪元素与伪类的基本区别。 基本描述 CSS伪元素也是应用于选择器的…

无线温湿度信息收集点模块的组成和工作状态及编程与组网建议

在传感技术与物联网的不断发展下&#xff0c;无线温湿度信息收集点模块作为一种重要的终端设备&#xff0c;被广泛应用于各个领域。本文将详细介绍该模块的组成和工作状态&#xff0c;并给出编程和组网的建议。 一、组成 该无线温湿度信息收集点模块由以下几个核心组成部分构成…

安卓:百度地图开发(超详细)

一、百度地图介绍 百度地图SDK是一套供开发者使用的软件开发工具包&#xff08;SDK&#xff09;&#xff0c;用于在Android应用程序中集成和使用百度地图功能。通过使用百度地图SDK&#xff0c;开发者可以实现在自己的应用中显示地图、获取定位信息、进行搜索、导航等功能。 百…

算法----二叉搜索树中第K小的元素

题目 二叉搜索树中第K小的元素 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 个最小元素&#xff08;从 1 开始计数&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,null,2], k 1 输出&#xff…

STL中的神秘“指针”:迭代器

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;C学习 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大…

NAT协议(网络地址转换协议)详解

NAT协议&#xff08;网络地址转换协议&#xff09;详解 为什么需要NATNAT的实现方式静态NAT动态NATNAPT NAT技术的优缺点优点缺点 NAT协议是将IP数据报头中的IP地址转换为另外一个IP地址的过程&#xff0c;主要用于实现私有网络访问公有网络的功能。这种通过使用少量的IP地址代…

2023-7-26-第二十三式解释器模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

[vue] 新项目配置整理(没写完,回头有空继续)

省流版(vue2项目)&#xff1a; 脚手架&#xff1a;vue create xxxx vuex&#xff1a;npm i vuex3 router : npm install vue-router3 vue cli创建项目 vue create xxxx(项目名称) 添加基本配置 module.exports {lintOnSave: false, // 关闭eslint检查publicPath:./, //…

Longhorn vs Rook vs OpenEBS vs Portworx vs IOMesh:细说 5 款 K8s 持久化存储产品优劣势

云原生时代下&#xff0c;越来越多的企业开始使用 Kubernetes&#xff08;K8s&#xff09;承载数据库、消息中间件等“生产级”有状态工作负载。由于这些应用对数据持久保存、性能、容量扩展和快速交付具有较高的要求&#xff0c;企业往往需要采用专为 Kubernetes 环境设计的持…

ViT-vision transformer

ViT-vision transformer 介绍 Transformer最早是在NLP领域提出的&#xff0c;受此启发&#xff0c;Google将其用于图像&#xff0c;并对分类流程作尽量少的修改。 起源&#xff1a;从机器翻译的角度来看&#xff0c;一个句子想要翻译好&#xff0c;必须考虑上下文的信息&…