座位安排(欧拉回路,高斯消元,bitset)
题面
由于旋转大师
F
r
e
n
c
h
\rm French
French 的离去,
A
r
e
x
t
r
e
\rm Arextre
Arextre 光荣地承担了给全班换座位的重任。
由于这是个有
O
n
e
I
n
D
a
r
k
\rm OneInDark
OneInDark 和
H
a
n
d
I
n
D
e
v
i
l
\rm HandInDevil
HandInDevil 的班级,所以换座位难免有些困难。
全班一共有
n
n
n 个同学,有
m
m
m 对好友关系,当其中一对好友关系中的两人
u
i
,
v
i
u_i,v_i
ui,vi 不在同一个大组时,这对关系就无效。
A
r
e
x
t
r
e
\rm Arextre
Arextre 需要把全班划分为
r
r
r 个大组(有序),满足划分后由有效的好友关系组成的图中,每个连通块都存在欧拉回路(注意:每个大组不必连通)。
A
r
e
x
t
r
e
\rm Arextre
Arextre 已经划分好了,方案还不能公开,但是好友关系是知道的。你很好奇,
r
r
r 的最小值是多少,以及满足
r
r
r 取最小值时的划分方案数是多少,方案数对 998244353 取模。
数据范围:
n
≤
2000
,
m
≤
1
0
5
n\leq2000\;,\;m\leq10^5
n≤2000,m≤105
样例输入
4 5
1 2
2 3
3 1
2 4
3 4
样例输出
2 4
题解
根据欧拉回路的性质,一个无向连通图存在欧拉回路当且仅当每个点的度数都为偶数
首先,如果整张图本来每个点的度数就为偶数,那么直接 {printf("1 1");return 0;} 完事,这个应该很好判断。
然后,我们可以证明
r
r
r 最小为
2
2
2 :
此时考虑怎么安排每个点,我们令
x
i
=
0
/
1
x_i=0/1
xi=0/1 表示组号,0 表示在 0 大组,1 表示在 1 大组,于是每个点的度数奇偶性就为
⨁
i
→
j
(
x
i
⊕
x
j
⊕
1
)
\bigoplus_{i\rightarrow j}(x_i\oplus x_j\oplus 1)
i→j⨁(xi⊕xj⊕1)
把这个线性异或方程组拿去高斯消元,若无解,也就是左边全消完,右边剩个 1。一开始的每个方程等式右边是原先度数的奇偶性,左边是邻接矩阵的第
i
i
i 行再在第
i
i
i 个位置异或度数。方程互消相当于异或,选一些方程异或起来,如果左边等于 0,相当于原图中的一个连通块、再加上若干个与该连通块连边数为偶数的点(不然不会异或出 0),连通块外的点对等式右边的贡献肯定就是偶数了,连通块内的点则满足每一条边贡献度数为 2,那么度数总和为偶数,等式右边也应该是 0。也就是说该方程组不存在无解的情况,一定有解。
既然一定有解,那么方案数就是高斯消元后的自由变元个数了。用 bitset 优化高斯消元,可以做到
O
(
n
3
64
)
O(\frac{n^3}{64})
O(64n3) 。
CODE
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<bitset>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 2005
#define BT bitset<2005>
#define DB double
#define LL long long
#define ENDL putchar('\n')
#define lowbit(x) (-(x) & (x))
LL read() {
LL f = 1,x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s=='-')f = -f;s = getchar();}
while(s >= '0' && s <= '9') {x=x*10+(s-'0');s = getchar();}
return f * x;
}
const int MOD = 998244353;
int n,m,i,j,s,o,k;
int g[MAXN][MAXN];
int ind[MAXN];
BT a[MAXN];
int main() {
freopen("base.in","r",stdin);
freopen("base.out","w",stdout);
n = read();m = read();
for(int i = 1;i <= m;i ++) {
s = read();o = read();
g[s][o] = g[o][s] = 1;
ind[s] ++; ind[o] ++;
}
bool flag = 1;
for(int i = 1;i <= n;i ++) if(ind[i] & 1) flag = 0;
if(flag) {
printf("1 1");
return 0;
}
for(int i = 1;i <= n;i ++) {
for(int j = 1;j <= n;j ++) {
if(g[i][j]) {
a[i][j] = a[i][j]^1;
a[i][n+1] = a[i][n+1]^1;
a[i][i] = a[i][i]^1;
}
}
}
int ans = 1;
for(int i = 1;i <= n;i ++) {
if(!a[i][i]) {
for(int j = i+1;j <= n;j ++) {
if(a[j][i]) {
swap(a[i],a[j]);
break;
}
}
}
if(!a[i][i]) {
ans = ans *2ll % MOD;
continue;
}
for(int j = 1;j <= n;j ++) {
if(j != i && a[j][i]) {
a[j] ^= a[i];
}
}
}
printf("%d %d\n",2,ans);
return 0;
}
座位安排(欧拉回路,高斯消元,bitset)的更多相关文章
- [SDOI2010]外星千足虫 题解 高斯消元+bitset简介
高斯消元 + bitset 简介: 高斯消元其实就是以加减消元为核心求唯一解.这道题还是比较裸的,可以快速判断出来.我们将每一只虫子看作一个未知数,这样根据它给出的 m 组方程我们可以高斯消元得出每一 ...
- bzoj 1923 [Sdoi2010]外星千足虫(高斯消元+bitset)
1923: [Sdoi2010]外星千足虫 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 634 Solved: 397[Submit][Status ...
- BZOJ_1923_[Sdoi2010]外星千足虫_高斯消元+bitset
BZOJ_1923_[Sdoi2010]外星千足虫_高斯消元 Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结 ...
- BZOJ3503:[CQOI2014]和谐矩阵(高斯消元,bitset)
Description 我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1.一个元素相邻的元素包括它本 身,及他上下左右的4个元素(如果存在). 给定矩阵的行数和列数,请计算并输 ...
- BZOJ 1923: [Sdoi2010]外星千足虫 高斯消元+bitset
高斯消元求解异或方程组,可以多学一下 $bitset$ 在位运算中的各种神奇操作. #include <cstdio> #include <bitset> #define N ...
- P3164 [CQOI2014]和谐矩阵(高斯消元 + bitset)
题意:构造一个$n*m$矩阵 使得每个元素和上下左右的xor值=0 题解:设第一行的每个元素值为未知数 可以依次得到每一行的值 然后把最后一行由题意条件 得到$m$个方程 高斯消元解一下 bitset ...
- [luoguP2447] [SDOI2010]外星千足虫(高斯消元 + bitset)
传送门 用bitset优化,要不然n^3肯定超时 消元过程中有几点需要注意,找到最大元后break,保证题目中所说的K最小 如果有自由元说明解很多,直接返回 #include <bitset&g ...
- BZOJ.1923.[SDOI2010]外星千足虫(高斯消元 异或方程组 bitset)
题目链接 m个方程,n个未知量,求解异或方程组. 复杂度比较高,需要借助bitset压位. 感觉自己以前写的(异或)高斯消元是假的..而且黄学长的写法都不需要回代. //1100kb 324ms #i ...
- 【高斯消元】【异或方程组】【bitset】bzoj1923 [Sdoi2010]外星千足虫
Xor方程组解的个数判定: ——莫涛<高斯消元解Xor方程组> 使用方程个数判定:消去第i个未知数时,都会记录距第i个方程最近的第i位系数不为0の方程是谁,这个的max就是使用方程个数. ...
随机推荐
- ElasticSearch7.3学习(三十一)----Logstash基础学习
一.Logstash基本介绍 Logstash 是一个功能强大的工具,可与各种部署集成. 它提供了大量插件,可帮助你解析,丰富,转换和缓冲来自各种来源的数据(文件.数据库......).logstas ...
- .NET 处理[未能为 SSLTLS 安全通道建立信任关系]问题
更新记录 2022年4月16日本文迁移自Panda666原博客,原发布时间:2021年7月16日. 在.NET的开发过程中,发现[基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系]问题 ...
- 表达式的动态解析和计算,Flee用起来真香
前言 在很多项目中经常会出现需要动态解析表达式和计算的场景,比如一些自动审核规则,或者是一些变量的值通过维护的公式在运行过程中动态算出:由于场景需求,都需要比较灵活的配置对应的表达式,然后希望在需要的 ...
- 原生实现.NET5.0+ 自定义日志
一.定义一个静态类 声明一个 ReaderWriterLockSlim 对象 用于并发控制 1 /// <summary> 2 /// IO锁 3 /// </summary> ...
- bat-设置oracle服务
1.停止oracle所有服务 并将服务设置为手动启动 @echo off echo oracle服务--------停止 net stop OracleVssWriterORCL net stop O ...
- 通过Go语言创建CA与签发证书
本篇文章中,将描述如何使用go创建CA,并使用CA签署证书.在使用openssl创建证书时,遵循的步骤是 创建秘钥 > 创建CA > 生成要颁发证书的秘钥 > 使用CA签发证书.这种 ...
- android stdio开发抖音自动点赞案例
最近做了一个安卓开发自动刷抖音. 点赞. 评论等等养号行为. 总结一下知识点和遇到的一些问题: 知识点: 1. 使用acessibility mode 对抖音自动化操作. android stdio中 ...
- 今天介绍一下自己的开源项目,一款以spring cloud alibaba为核心的微服务架构项目,为给企业与个人提供一个零开发基础的微服务架构。
LaoCat-Spring-Cloud-Scaffold 一款以spring cloud alibab 为核心的微服务框架,主要目标为了提升自己的相关技术,也为了给企业与个人提供一个零开发基础的微服务 ...
- 要想不踩SaaS那些坑,得先了解“SaaS架构”
摘要:围绕当下许多企业青睐的SaaS应用开发,华为云开发者技术服务工程师程泽在DTT首期带来主题为 <SaaS云原生应用典型架构> 的DTT首期直播分享. 本文分享自华为云社区<DT ...
- Jackson 解析 JSON 详细教程
点赞再看,动力无限. 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. JSON 对于开发者并不陌生,如今的 ...