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 实现消息延迟的原理…

MySQL5.7小版本升级-In-Place方式

在 Centos7.9上升级二进制方式安装的MySQL 。升级方式有就地升级和逻辑升级2种方法&#xff0c;本实验演示In-Place Upgrade就地升级的方式将mysql-5.7.17升级至5.7.44 In-Place Upgrade就地升级Logical Upgrade逻辑升级 升级方式介绍 In-Place Upgrade就地升级 In-Place U…

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;存储空间中数据全部丢失。 故障存储中一共…

Oracle常用运维SQL-SQL执行性能及锁表等查询分析

oracle相关系列文章: docker–在Anaconda jupyter 容器中使用oracle数据源时,Oracle客户端安装配置及使用示例 Oracle常用运维SQL–用户管理、数据导入、导出的实用脚本 Oracle TEMPORARY TABLE 临时表的使用及删除报ORA-14452错误的解决办法 Oracle常用运维SQL-SQL执行性能及…

R 复习 菜鸟教程

R语言老师说R好就业&#xff0c;学就完了 基础语法 cat()可以拼接函数&#xff1a; > cat(1, "加", 1, "等于", 2, \n) 1 加 1 等于 2sink()&#xff1a;重定向 sink("r_test.txt", splitTRUE) # 控制台同样输出 for (i in 1:5) print(i…

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

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

【星海出品】VUE(五)

表单 表单输入绑定 只需要v-model声明一下这个变量就可以。 还可以选择不同的类型&#xff0c;例如 type"checkbox“ v-model 也提供了 lazy、number、.trim 功能&#xff0c;只需要在v-model后面加入.lazy 例如&#xff1a;v-model.lazy”message“ <template><…

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

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

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

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

css主题切换

html <!DOCTYPE html> <html> <head><title>主题切换示例</title> </head> <body><div class"app"><button id"themeButton">切换主题</button><div class"content"><h1…

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

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

【Go】-调用企微机器人

没有什么好讲的&#xff0c;直接贴代码&#xff0c;消息格式我用的markdown。 sendMsg.go&#xff1a; package mainimport ("flag""fmt""github.com/goccy/go-json""github.com/tidwall/gjson""io/ioutil""net/http…

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;元…