AtCoder Beginner Contest 327 G. Many Good Tuple Problems(带标号二分图计数+有区别小球放入有区别盒子)

题目

一个长为n(n<=30)的原始序列x,x[i]可以取值0或1

一个长为m(m<=1e9)的点对序列(s,t),

s序列第i项和t的第i项(s_{i},t_{i}),均可以取值[1,n],

如果构造好s和t后,对任意(s_{i},t_{i})都存在01序列x使得x_{s_{i}}\neq x_{t_{i}}

则称这个序列是合法的,问n^{2*m}种(s,t)序列中,有多少合法序列,

答案对998244353取模

思路来源

官方题解

https://www.cnblogs.com/chasedeath/p/14567667.html

题解

考虑1-n共n个点的不含自环的有向图,C_{n}^{2}条边,如果可以用(i,j)边,表示x[i]\neq x[j]

而最终x是要被化成两堆的,一堆0一堆1,也就是一个二分图

要求二分图的某一个带标号的边集方案只能被计一次,

有向图不好统计,可以考虑看成无向图,也就是(1,2)和(2,1)看成一种边

最后填入m个位置后再决定翻不翻转,再乘上对应的2^m种选法

所以,需要统计的是有标号二分图的方案数

有标号二分图计数

g[i][j]表示i个点j条边的二分图方案数,允许重复

g[i][j]=\sum_{k=1}^{i-1}C_{i}^{k}C_{k*(i-k)}^{j}

即枚举二分图左边选了k个点,右边选了i-k个点,k*(i-k)条边里选j条,

这样的话,一个有着t个连通块的二分图会被计数2^t次,

因为对应连通块部分可以左右互换,从而在另一种合法答案中被统计到

于是考虑怎么去重

h[i][j]表示i个点j条边连通的二分图,

然而连通块数定义在状态里不好用于转移,所以后续的计数考虑容斥

通过g[i][j]减掉不合法的方案,

枚举最后一个点所在的连通块多大,

对应连通块和之前的二分图是在什么时候断裂的

当大小为k时,从i-1个点中选k-1个点,再对应选出一些边

h[i][j]=g[i][j]-\sum_{k=1}^{i-1}\sum_{l=0}^{j}C_{i-1}^{k-1}*h[k][j]*g[i-k][j-l]

有了联通的二分图之后,再考虑如何合并

如上文所说,一个有着t个连通块的二分图会被计数2^t次,

而h方案是连通的,即一个连通块会被计数2次,

左右各一次,所以除以2是实际的方案数

f[i][j]表示i个点j条边由若干个连通块组成、无重复的二分图

转移仍然枚举最后一个点所在的连通块多大,

从之前的f合法方案,通过背包转移到新的合法方案

当大小为k时,从i-1个点中选k-1个点,再对应选出一些边

f[i][j]=\frac{h[i][j]}{2}+\sum_{k=1}^{i-1}\sum_{l=0}^{j}C_{i-1}^{k-1}*\frac{h[k][l]}{2}*f[i-k][j-l]

求出f[i][j]后,n个点是固定的,

因为f[n-1][j]可以通过不用边的方式转移到f[n][j]

所以,只需要用到f[n][j]的状态,无需再遍历f[i<n][j]的值

当有j条边时,需要满足j条边填到m个位置,j条边都至少出现一次,不然计数就会有重复

小球放盒问题
方法一

这等价于m个有区别的小球放入j个有区别的盒子,每个盒子不能为空

而第二类斯特林数S(m,j)为m个有区别的小球放入j个无区别的盒子的方案数,

所以求出乘上j个盒子的顺序即可,代码中用dp2[i]表示

方法二

互换小球和盒子,

dp[i]表示恰有i种球被放到了m个盒子里,每个盒子只能放一个球

那么就需要用全量的情况,减掉不合法的情况

dp[i]=i^m-\sum_{j=1}^{i-1}C_{i}^j*dp[j]

代码

// Problem: G - Many Good Tuple Problems
// Contest: AtCoder - HHKB Programming Contest 2023(AtCoder Beginner Contest 327)
// URL: https://atcoder.jp/contests/abc327/tasks/abc327_g
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<ll,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define scll(a) scanf("%lld",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
const int N=31,M=N*N,mod=998244353,inv2=(mod+1)/2;
int t,n,m,f[N][M],g[N][M],h[N][M],c[M][M],dp[M],dp2[M];
void ADD(int &x,int y){x=(x+y)%mod;
}
int modpow(int x,int n,int mod){int res=1;for(;n;n>>=1,x=1ll*x*x%mod){if(n&1)res=1ll*res*x%mod;}return res;
}
int C(int x,int y){if(x<0 || y<0 || x<y)return 0;return c[x][y];
}
void sol(){sci(n),sci(m);c[0][0]=1;rep(i,1,M-1){c[i][0]=c[i][i]=1;rep(j,1,i-1){c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;}}rep(i,1,M-1){dp[i]=modpow(i,m,mod);rep(j,1,i-1){ADD(dp[i],mod-1ll*c[i][j]*dp[j]%mod);}//printf("i:%d f:%d\n",i,dp[i]);}rep(i,1,M-1){rep(j,1,i){int sg=((i-j)&1)?-1:1;ADD(dp2[i],(1ll*sg*C(i,j)%mod*modpow(j,m,mod)%mod)%mod);}//printf("i:%d f:%d\n",i,dp2[i]);}int ans=0;rep(i,1,n){int up=i*(i+1)/4;rep(j,0,up){rep(k,0,i){ADD(g[i][j],1ll*C(i,k)*C(k*(i-k),j)%mod);}h[i][j]=g[i][j];rep(k,1,i-1){rep(l,0,j){ADD(h[i][j],mod-1ll*C(i-1,k-1)*h[k][l]%mod*g[i-k][j-l]%mod);}}f[i][j]=1ll*h[i][j]*inv2%mod;rep(k,1,i-1){rep(l,0,j){ADD(f[i][j],1ll*C(i-1,k-1)*h[k][l]%mod*f[i-k][j-l]%mod*inv2%mod);}}//printf("i:%d j:%d 1:%d 2:%d 3:%d\n",i,j,g[i][j],h[i][j],f[i][j]);//printf("i:%d j:%d f:%d\n",i,j,f[i][j]);//if(i==n && j<=m)printf("i:%d j:%d f:%d dp:%d add:%d\n",i,j,f[i][j],dp[j],1ll*f[i][j]*dp[j]%mod);if(i==n)ADD(ans,1ll*f[i][j]*dp[j]%mod);}}//pte(ans);ans=1ll*ans*modpow(2,m,mod)%mod;pte(ans);
}
int main(){t=1;//sci(t); // t=1while(t--){sol();}return 0;
}

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

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

相关文章

【RabbitMQ】 RabbitMQ 消息的延迟 —— 深入探索 RabbitMQ 的死信交换机,消息的 TTL 以及延迟队列

文章目录 一、死信交换机1.1 什么是死信和死信交换机1.2 死信交换机和死信队列的创建方式 二、消息的 TTL2.1 什么是消息的 TTL2.2 基于死信交换机和 TTL 实现消息的延迟 三、基于 DelayExchang 插件实现延迟队列3.1 安装 DelayExchang 插件3.2 DelayExchang 实现消息延迟的原理…

perl列表创建、追加、删除

简介 perl 列表追加元素 主要是通过push和unshift函数来实现。其中&#xff0c;push是追加到列表尾&#xff0c;unshift是追加到列表头。 perl列表删除元素 主要是通过pop和shift函数来实现。其中&#xff0c;pop是从列表尾删除一个元素&#xff0c; shift是从列表头删除一…

6大场景,玩转ChatGPT!

文章目录 一、故事叙述提问举例 二、产品描述提问举例 三、报告撰写提问举例 四、邮件和信件撰写提问举例 五、新间稿和公告撰写提问举例 六、学术论文和专业文章撰写提问举例 本文是在GPT3.5版本下演示的 我们知道AI技术不仅能够自动生成文章和内容&#xff0c;还可以根据我们…

【大数据】NiFi 中的重要术语

NiFi 中的重要术语 1.Flow Controller2.Processor3.Connection4.Controller Service5.Process Group6.FlowFile 那些一个个黑匣子称为 Processor&#xff0c;它们通过称为 Connection 的队列交换名为 FlowFile 的信息块。最后&#xff0c;FlowFile Controller 负责管理这些组件…

XSAN数据恢复-存储空间架构迁移时误格式化存储系统的XSAN数据恢复案例

XSAN数据恢复环境&#xff1a; 昆腾存储&#xff0c;MAC OS操作系统&#xff0c;存放视频类数据&#xff08;MXF、MOV等格式文件&#xff09;。 XSAN故障&检测&#xff1a; 将存储空间从XSAN架构迁移到STORNEXT架构后&#xff0c;存储空间中数据全部丢失。 故障存储中一共…

蓝桥杯官网填空题(方格计数)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 如下图所示&#xff0c;在二维平面上有无数个 11 的小方格。 我们以某个小方格的一个顶点为圆心画一个半径为 50000 的圆。 你能计算出这个圆里有多少个完整的小方…

Azure 机器学习 - 设置 AutoML 训练时序预测模型

目录 一、环境准备二、训练和验证数据三、配置试验支持的模型配置设置特征化步骤自定义特征化 四、可选配置频率和目标数据聚合启用深度学习目标滚动窗口聚合短时序处理非稳定时序检测和处理 五、运行试验六、用最佳模型进行预测用滚动预测评估模型精度预测未来 七、大规模预测…

Flink源码解析八之任务调度和负载均衡

源码概览 jobmanager scheduler:这部分与 Flink 的任务调度有关。 CoLocationConstraint:这是一个约束类,用于确保某些算子的不同子任务在同一个 TaskManager 上运行。这通常用于状态共享或算子链的情况。CoLocationGroup & CoLocationGroupImpl:这些与 CoLocationCon…

已完结,给小白的《50讲Python自动化办公》

大家好&#xff0c;这里是程序员晚枫&#xff0c;小红薯也叫这个名。 写在前面 上个周末去成都参加了第8届中国开源年会&#xff0c;认识了很多行业前辈和优秀的同龄人。 我发现在工作之外还能有一番事业的人&#xff0c;都有一个让我羡慕的共同点&#xff1a;有一个拿得出手…

C++笔记之表驱动法

C笔记之表驱动法 code review! 文章目录 C笔记之表驱动法0.数组小技巧1.std::map实现2.结构体实现3.数组和结构体结合实现表驱动法-存储函数指针4.表驱动法概念-ChatGPT5. 直接访问表&#xff08;Direct Access Table&#xff09;的示例6. 索引访问表&#xff08;Indexed Acc…

Yolov8目标识别与实例分割——算法原理详细解析

前言 YOLO是一种基于图像全局信息进行预测并且它是一种端到端的目标检测系统&#xff0c;最初的YOLO模型由Joseph Redmon和Ali Farhadi于2015年提出&#xff0c;并随后进行了多次改进和迭代&#xff0c;产生了一系列不同版本的YOLO模型&#xff0c;如YOLOv2、YOLOv3、YOLOv4&a…

项目上线前发现严重Bug怎么办?

今天分享一个面试问题&#xff0c;现在有一个面试场景&#xff1a; 项目计划明天发布&#xff0c;但是在今天你作为测试人员发现了一个严重的bug&#xff0c;市场相关人员又在催发布的事情&#xff0c;这个时候你应该怎么办&#xff1f; 这是测试工程师不管是在面试&#xff0…

JVM常用命令

jps —查看pid jstat -gcutil 4364 1000 2000 —查看堆内存占用百分比&#xff0c;每秒打印1次&#xff0c;总共打印2000次 S0&#xff1a;幸存1区当前使用比例 S1&#xff1a;幸存2区当前使用比例 E&#xff1a;伊甸园区使用比例 O&#xff1a;老年代使用比例 M&#xff1a;元…

基于计算机视觉的身份证识别系统 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器视觉的身份证识别系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-sen…

初识jQuery

文章目录 一、jQuery介绍二、Jquery优势三、jQuery版本四、jQuery对象jQuery的引用js代码与jQuery代码对比标签对象与jQuery对象 五、jQuery查找标签1.基本选择器2.组合选择器3.层次选择器4.属性选择器5.基本筛选器6.表单筛选器 六、筛选器方法七、操作标签1.class操作2.文本操…

048基于web+springboot的校园资料分享平台

欢迎大家关注&#xff0c;一起好好学习&#xff0c;天天向上 文章目录 一项目简介技术介绍 二、功能组成三、效果图四、 文章目录 一项目简介 本校园资料分享平台有管理员和用户两个角色。管理员功能有个人中心&#xff0c;学生管理&#xff0c;资料分享管理&#xff0c;资源分…

FastBond2阶段2——基于ESP32C3开发的简易IO调试设备

1. 项目介绍 之前买了许多国产单片机esp32c3一直在吃灰&#xff0c;没有发挥它的真实价值。非常感谢硬禾组织的Fastbond2活动&#xff0c;刚好两者经过微妙的碰撞。恰可以用于FastBond2活动主题4 - 测量仪器&#xff08;单片机开发测试领域&#xff09;&#xff0c;或者用于国…

VR全景在医院的应用:缓和医患矛盾、提升医院形象

医患关系一直以来都是较为激烈的&#xff0c;包括制度的不完善、医疗资源紧张等问题也时有存在&#xff0c;为了缓解医患矛盾&#xff0c;不仅要提升患者以及家属对于医院的认知&#xff0c;还需要完善医疗制度&#xff0c;提高医疗资源的配置效率&#xff0c;提高服务质量。 因…

Linux学习笔记之三(vim编辑器)

目录 1、vim的四种工作模式2、正常模式下的操作指令2.1、进入编辑模式2.2、进入命令行模式2.3、进入视觉模式2.4、光标跳转2.5、复制、粘贴、删除2.6、重复、撤回操作 3、命令行模式下的操作指令 1、vim的四种工作模式 vim的四种工作模式分别是编辑模式(insert mode)、命令行模…

多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉 计算机竞赛

文章目录 0 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习多目标跟踪 …