座位安排(欧拉回路,高斯消元,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就是使用方程个数. ...
随机推荐
- RMQ——ST表
ST表 ST表是一种解决RMQ问题的强有力工具, 可以做到O(nlogn)预处理,O(1)查询. st[i][j] 表示区间 [i, i + 2 ^ j - 1] 的最大值. 初值 st[i][0] ...
- Dcoker镜像管理与容器应用
Dcoker镜像管理与容器应用 docker基于镜像创建容器 相同版本的镜像只允许存在一个 同一个镜像可以创建多个容器 镜像管理 [root@localhost ~]# docker pull cen ...
- Linux yum搭建私有仓库
搭建yum仓库需要两种资源: rpm包 rpm包的元数据(repodata) 搭建好仓库后需要使用三种网络协议共享出来 http或https ftp 范例: 使用http协议搭建私有仓库 (本示例使用 ...
- SHT11和SHT21传感器
1.传感器概述 SHT11和SHT21为瑞士Sensirion公司生产,精度和测量范围较广,但价格较高.SHT11和SHT21是具有IIC总线接口的单片全校准数字式相对湿度和温度传感器.该传感器采用独 ...
- Error:(4, 13) java: -source 1.5 中不支持默认方法 (请使用 -source 8 或更高版本以启用默认方法)
- NC20583 [SDOI2016]齿轮
题目链接 题目 题目描述 现有一个传动系统,包含了N个组合齿轮和M个链条.每一个链条连接了两个组合齿轮u和v,并提供了一个传动比x : y. 即如果只考虑这两个组合齿轮,编号为u的齿轮转动x圈,编号为 ...
- 4-2 Spring MVC框架-01
Spring MVC框架-01 Ⅰ.接收客户端请求 1. 关于Spring MVC框架 Spring MVC是基于Spring框架基础之上的 作用: 接收请求,响应结果,处理异常 主要解决了后端服务器 ...
- 揭开服务网格~Istio Service Mesh神秘的面纱
目录 一.写在前面 二.微服务与K8S 三.服务网格与K8S 四.常见的产品 五.Istio架构 六.Istio的核心资源介绍 6.1.VirtualService 6.2.Destination R ...
- Object类中wait代餐方法和notifyAll方法和线程间通信
Object类中wait代餐方法和notifyAll方法 package com.yang.Test.ThreadStudy; import lombok.SneakyThrows; /** * 进入 ...
- python 异常捕捉与异常处理
简介 在实际开发中,为了防止异常界面直接被用户看到,往往我们会采用捕捉异常的方式来进一步处理异常. 异常捕捉 如下代码由于下标越界会导致异常 data = range(10) print(data[1 ...