AtCoder Beginner Contest 336 G. 16 Integers(图计数 欧拉路径转欧拉回路 矩阵树定理 best定理)

题目

给16个非负整数,x[i∈(0,1)][j∈(0,1)][k∈(0,1)][l∈(0,1)]

求长为n+3的01串的方案数,满足长度为4的ijkl(2*2*2*2,16种情况)串恰为x[i][j][k][l]个

答案对998244353取模

思路来源

https://www.cnblogs.com/tzcwk/p/matrix-tree-best-theroem.html

矩阵树定理 - OI Wiki

知识点总结

矩阵树定理

对于一张无向图G,

记D为其度数矩阵,满足:

1. D[i][i]=i的度数

2. D[i][j]=0(i≠j)

记A为其邻接矩阵,满足:

1. A[i][j]=i与j之间边的条数,如果有重边则算作多条边。

记基尔霍夫矩阵(拉普拉斯矩阵)K=D−A,

则去掉第k行第k列得到的矩阵行列式即为G生成树的个数。

BEST 定理

对于一个欧拉图(有向图)而言,

从x出发回到x的欧拉回路的个数为:

t^{root}(n,k)*\prod_{v\epsilon V}(deg(v)-1)!

其中,t^{root}(n,k)为任一个点的根向树形图的数量,用矩阵树定理求得,

后半部分,即对于每个点,再乘以每个点的度数减1的阶乘

根向树形图

根向树形图是一棵树,所有边都往根的方向指

一些技巧

求欧拉路径的数量

二层枚举欧拉路径的起点、终点,钦定加一条终点到起点的边,转化为求欧拉回路

仅要求所有边经过一次(部分点可以孤立)

忽略掉孤立点后,对剩下的点离散化后,重新建矩阵,求矩阵的秩

需要视题目决定是否需要乘deg[v](从v出发回到v)

少乘度数的是带循环同构的边序列

思路来源

官方题解

题解

1. 把形如abcd的出现次数,转化为abc->bcd有向边的边的条数,

转化为成边数后,即求欧拉路径条数,

枚举欧拉路径起点终点后,强制加一条边,转成欧拉回路后,套用best定理

2. 对于枚举起点为i,终点为j的情况,先强制加一条j->i的边,

统计每个点x的入度in[x]、出度out[x]

① 忽略孤立点,即in[x]=out[x]=0

② 若in[x]和out[x]不相等,则无解

③ 若x非孤立点,且与i不联通,则无解

否则,

④忽略孤立点,将非孤立点重新编号建边

⑤按定义构建基尔霍夫矩阵K=D-A

即a[k][k]+=in[k](D矩阵),a[k][l]-=b[k][l](A矩阵)

            rep(k,0,7){ // 基尔霍夫矩阵a[to[k]][to[k]]=in[k];rep(l,0,7){if(!to[l])continue;a[to[k]][to[l]]-=b[k][l];//printf("%d ",a[k][l]);}}

⑥求矩阵的秩,得到生成树数量,依次乘以(deg[i]-1)!得到欧拉回路数量

⑦欧拉回路是一个环,每个环被统计一次,

固定新增的那条边在串最后指向串最前,即可唯一对应一个串

但是注意到,当abc->bcd有两条相同的边x1、x2时,二者的顺序会被欧拉回路视为不同的方案

而在序列中,abcd是一个唯一的序列,被重复计算

所以,需要除掉完全相同的边的顺序,类似可重集全排列的方案数

代码

// Problem: G - 16 Integers
// Contest: AtCoder - AtCoder Beginner Contest 336
// URL: https://atcoder.jp/contests/abc336/tasks/abc336_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=1e6+10,M=16,K=8,mod=998244353;
int t,fac[N],x[M],b[K][K],in[K],out[K],par[K];
int find(int x){return par[x]==x?x:par[x]=find(par[x]);
}
void merge(int x,int y){x=find(x),y=find(y);if(x==y)return;par[y]=x;
}
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 Gauss(vector<vector<int> >&a,int n){//printf("x:%d\n",x);int ans=1;//swap(a[0],a[x]);for(int i=2;i<=n;i++){for(int j=i;j<=n;j++){if(!a[i][i] && a[j][i]){swap(a[i],a[j]);ans=mod-ans;break;}}ans=1ll*ans*a[i][i]%mod;for(int j=1;j<=n;j++){if(i==j || !a[j][i])continue;int t=1ll*a[j][i]*modpow(a[i][i],mod-2,mod)%mod;for(int k=1;k<=n;k++){a[j][k]=(a[j][k]-1ll*t*a[i][k]%mod+mod)%mod;}}}return ans;
}
void sol(){rep(i,0,15){b[i>>1][i&7]=x[i];}int res=0;rep(i,0,7){rep(j,0,7){b[j][i]++;//欧拉路径->欧拉回路bool ok=1;memset(in,0,sizeof in);memset(out,0,sizeof out);rep(k,0,7)par[k]=k;rep(k,0,7){rep(l,0,7){in[l]+=b[k][l];out[k]+=b[k][l];if(b[k][l])merge(k,l);//if(b[k][l])printf("i:%d j:%d k:%d l:%d b:%d\n",i,j,k,l,b[k][l]);}}rep(k,0,7){if(!in[k] && !out[k])continue;//孤立点,只是要求遍历所有边时,可忽略if(in[k]!=out[k])ok=0;//判出入度if(find(k)!=find(i))ok=0;//判连通//printf("i:%d j:%d k:%d in:%d out:%d\n",i,j,k,in[k],out[k]);}if(!ok){b[j][i]--;continue;}int bs=1;//deg[i]rep(k,0,7){if(!in[k])continue;bs=1ll*bs*fac[in[k]-1]%mod;//\prod (deg[i]-1)}vector<vector<int>>a(K+1,vector<int>(K+1,0));vector<int>to(K+1,0);int id=0;rep(k,0,7){if(in[k])to[k]=++id;}rep(k,0,7){ // 基尔霍夫矩阵a[to[k]][to[k]]=in[k];rep(l,0,7){if(!to[l])continue;a[to[k]][to[l]]-=b[k][l];//printf("%d ",a[k][l]);}}int rank=Gauss(a,id);//求基尔霍夫矩阵的秩//printf("i:%d j:%d bs:%d rk:%d\n",i,j,bs,rank);bs=1ll*bs*rank%mod;rep(k,0,15){bs=1ll*bs*modpow(fac[x[k]],mod-2,mod)%mod;//去重}res=(res+bs)%mod;b[j][i]--;}}printf("%d\n",res);
}
void init(){fac[0]=1;rep(i,1,N-1)fac[i]=1ll*fac[i-1]*i%mod;
}
int main(){init();rep(i,0,15)sci(x[i]);sol();return 0;
}

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

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

相关文章

Go后端开发 -- 数组 slice map range

Go后端开发 – 数组 && slice && map && range 文章目录 Go后端开发 -- 数组 && slice && map && range一、数组1.数组的声明和初始化2.数组的传参 二、slice切片1.slice的定义和初始化2.len()和cap()函数3.空切片4.切片截取5…

vue print-js实现打印功能

vue print-js实现打印功能 使用npm安装print插件 npm install print-js --save在需要的文件里面引入 import Print from ‘print-js’在页面调用打印 <template><div><el-button click"printInfo">打印</el-button><div id"print…

【计算机组成与体系结构Ⅱ】指令调度与分支延迟(实验)

实验4&#xff1a;指令调度与分支延迟 一、实验目的 1. 加深对指令调度技术的理解。 2. 加深对分支延迟技术的理解。 3. 熟练采用指令调度技术解决流水线中的数据冲突的方法。 4. 进一步理解指令调度技术对CPU性能的改进。 5. 进一步理解延迟分支技术对CPU性能的改进。 二…

装完32G内存条 电脑飞跃提升!

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 大家…

MiniTab的拟合回归模型的分析

拟合回归模型概述 使用拟合回归模型和普通最小二乘法可以描述一组预测变量和一个连续响应之间的关系。可以包括交互作用项和多项式项、执行逐步回归和变换偏斜数据。 例如&#xff0c;房地产评估人员想了解城市公寓与多个预测变量&#xff08;包括建筑面积、可用单元数量、建…

【YOLO系列】 YOLOv4之Focal Loss损失函数

论文下载&#xff1a;Focal Loss for Dense Object Detection 一、简介 Focal Loss损失函数何凯明大神在RetinaNet网络中提出来的&#xff0c;主要是为了解决one-stage目标检测中正负样本比例严重失衡的问题。该损失函数降低了大量简单负样本在训练中所占的比重&#xff0c;也可…

MySQL中判断字段的字符数

CHAR_LENGTH函数用于返回字符串的长度&#xff0c;长度单位为字符 不管汉字,数字或是字母都算是一个字符&#xff0c;包括中英文标点符号&#xff0c;空格也算是一个字符 语法结构&#xff1a; CHAR_LENGTH(str) 示例&#xff1a; 表&#xff1a;Tweets ----------------…

安装Anaconda遇到的问题

报错如下&#xff1a; Anaconda3 5.1.0(64-bit) Setup Error:Due to incompatibility with several Pyth on libraries, Destination Folder’cannot contain non-ascii characters(special characters or diacritics). Please choose another location. 原因&#xff1a;安装…

JavaScript三元运算

JavaScript 中的三元运算符是一种简洁的条件语句&#xff0c;其语法结构如下&#xff1a; 条件 ? 表达式1 : 表达式2;这里的“条件”是一个布尔表达式&#xff08;即其结果为 true 或 false&#xff09;。如果条件为 true&#xff0c;则执行并返回“表达式1”的结果&#xff…

【Vue3】3-1 : 章节介绍 - Vue3组件应用及单文件组件

本书目录&#xff1a;点击进入 一、本章学习目标 二、课程安排 一、本章学习目标 Vue3组件相关概念掌握组件之间的通信封装一个可复用的组件单文件组件SFC&#xff1a;即.vue文件 样式 结构 逻辑脚手架的使用和底层实现机制工程化的认知 二、课程安排 组件的概念及组件的基…

AIGC笔记--CVAE模型的搭建

目录 1--CVAE模型 2--代码实例 1--CVAE模型 简单介绍&#xff1a; 与VAE类似&#xff0c;只不过模型的输入需要考虑图片和条件&#xff08;condition&#xff09;的融合&#xff0c;融合结果通过一个 encoder 映射到标准分布&#xff08;均值和方差&#xff09;&#xff0c;从…

基于ssm百货中心供应链管理系统+jsp论文

摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。本次开发一套百货中心供应链管理系统有管理…

transfomer中Decoder和Encoder的base_layer的源码实现

简介 Encoder和Decoder共同组成transfomer,分别对应图中左右浅绿色框内的部分. Encoder&#xff1a; 目的&#xff1a;将输入的特征图转换为一系列自注意力的输出。 工作原理&#xff1a;首先&#xff0c;通过卷积神经网络&#xff08;CNN&#xff09;提取输入图像的特征。然…

构建未来教育:在线培训系统开发的技术探讨

随着远程学习的崛起和数字化教育的普及&#xff0c;在线培训系统的开发成为了现代教育的核心。本文将深入讨论在线培训系统的关键技术要点&#xff0c;涵盖前后端开发、数据库管理、以及安全性和身份验证等关键方面。 前端开发&#xff1a;提供交互性与用户友好体验 在构建在…

02 SpringMVC接收数据之访问路径设置+四种接参方式+@EnableWebMvc

1.1 访问路径设置 RequestMapping注解的作用就是将请求的 URL 地址和处理请求的方式&#xff08;handler方法&#xff09;关联起来&#xff0c;建立映射关系。 SpringMVC 接收到指定的请求&#xff0c;就会来找到在映射关系中对应的方法来处理这个请求。 1.1.1 精准路径匹配…

京东ES支持ZSTD压缩算法上线了:高性能,低成本 | 京东云技术团队

1 前言 在《ElasticSearch降本增效常见的方法》一文中曾提到过zstd压缩算法[1]&#xff0c;一步一个脚印我们终于在京东ES上线支持了zstd&#xff1b;我觉得促使目标完成主要以下几点原因&#xff1a; Elastic官方原因&#xff1a;zstd压缩算法没有在Elastic官方的开发计划中&…

【Leetcode Sheet】Weekly Practice 24

Leetcode Test 447 回旋镖的数量(1.8) 给定平面上 n 对 互不相同 的点 points &#xff0c;其中 points[i] [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 &#xff0c;其中 i 和 j 之间的距离和 i 和 k 之间的欧式距离相等&#xff08;需要考虑元组的顺序&#xff09;。 …

最新智能AI系统ChatGPT网站程序源码+详细图文搭建部署教程,Midjourney绘画,GPT语音对话+ChatFile文档对话总结+DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

如何增加服务器的高并发

随着互联网的快速发展和普及&#xff0c;越来越多的应用程序需要支持高并发的请求处理。在这种情况下增加服务器的高并发能力成为了一个热门的话题。下面简单的介绍如果提高服务器的高并发能力。 负载均衡 是把请求分发到多个服务器上&#xff0c;来实现请求的平衡和分担。负…

使用JavaScript实现实时在线协作编辑器:从设计到实现

一、引言 随着Web技术的发展&#xff0c;实现在线协作编辑文档已经成为一种常见的需求。通过在线协作&#xff0c;多位用户可以同时编辑同一个文档&#xff0c;并实时看到其他用户的更改。这样的功能需要复杂的技术实现&#xff0c;包括数据同步、冲突解决和实时通信。本篇博客…