题面

由于旋转大师

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)的更多相关文章

  1. [SDOI2010]外星千足虫 题解 高斯消元+bitset简介

    高斯消元 + bitset 简介: 高斯消元其实就是以加减消元为核心求唯一解.这道题还是比较裸的,可以快速判断出来.我们将每一只虫子看作一个未知数,这样根据它给出的 m 组方程我们可以高斯消元得出每一 ...

  2. bzoj 1923 [Sdoi2010]外星千足虫(高斯消元+bitset)

    1923: [Sdoi2010]外星千足虫 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 634  Solved: 397[Submit][Status ...

  3. BZOJ_1923_[Sdoi2010]外星千足虫_高斯消元+bitset

    BZOJ_1923_[Sdoi2010]外星千足虫_高斯消元 Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结 ...

  4. BZOJ3503:[CQOI2014]和谐矩阵(高斯消元,bitset)

    Description 我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1.一个元素相邻的元素包括它本 身,及他上下左右的4个元素(如果存在). 给定矩阵的行数和列数,请计算并输 ...

  5. BZOJ 1923: [Sdoi2010]外星千足虫 高斯消元+bitset

    高斯消元求解异或方程组,可以多学一下 $bitset$ 在位运算中的各种神奇操作. #include <cstdio> #include <bitset> #define N ...

  6. P3164 [CQOI2014]和谐矩阵(高斯消元 + bitset)

    题意:构造一个$n*m$矩阵 使得每个元素和上下左右的xor值=0 题解:设第一行的每个元素值为未知数 可以依次得到每一行的值 然后把最后一行由题意条件 得到$m$个方程 高斯消元解一下 bitset ...

  7. [luoguP2447] [SDOI2010]外星千足虫(高斯消元 + bitset)

    传送门 用bitset优化,要不然n^3肯定超时 消元过程中有几点需要注意,找到最大元后break,保证题目中所说的K最小 如果有自由元说明解很多,直接返回 #include <bitset&g ...

  8. BZOJ.1923.[SDOI2010]外星千足虫(高斯消元 异或方程组 bitset)

    题目链接 m个方程,n个未知量,求解异或方程组. 复杂度比较高,需要借助bitset压位. 感觉自己以前写的(异或)高斯消元是假的..而且黄学长的写法都不需要回代. //1100kb 324ms #i ...

  9. 【高斯消元】【异或方程组】【bitset】bzoj1923 [Sdoi2010]外星千足虫

    Xor方程组解的个数判定: ——莫涛<高斯消元解Xor方程组> 使用方程个数判定:消去第i个未知数时,都会记录距第i个方程最近的第i位系数不为0の方程是谁,这个的max就是使用方程个数. ...

随机推荐

  1. torch.rand、torch.randn、torch.normal、torch.linespace

    torch.rand(*size, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) # ...

  2. Java系列之运算符

    运算符 算术运算符:+ (加).-(减) .*(乘)./(除).%(模).++(自增) . --(自减) 赋值运算符:= 关系运算符:>.<.>= <= == != insta ...

  3. Node.js精进(1)——模块化

    模块化是一种将软件功能抽离成独立.可交互的软件设计技术,能促进大型应用程序和系统的构建. Node.js内置了两种模块系统,分别是默认的CommonJS模块和浏览器所支持的ECMAScript模块. ...

  4. 如何优雅的使用MyBatis?

    ​本文目录 什么是 MyBatis ? 映射器(mappers) typeAliases 类型别名减少类完全限制名的冗余 处理枚举类型 多行插入 重用 SQL 代码段,消除重复 字符串替换#{}和${ ...

  5. 循环码、卷积码及其python实现

    摘要:本文介绍了循环码和卷积码两种编码方式,并且,作者给出了两种编码方式的编码译码的python实现 关键字:循环码,系统编码,卷积码,python,Viterbi算法 循环码的编码译码 设 \(C\ ...

  6. Kubernetes-23:详解如何将CPU Manager做到游刃有余

    k8s中为什么要用CPU Manager? 默认情况下,kubelet 使用CFS配额来执行 Pod 的 CPU 约束.Kubernetes的Node节点会运行多个Pod,其中会有部分的Pod属于CP ...

  7. NC14683 储物点的距离

    NC14683 储物点的距离 题目 题目描述 一个数轴,每一个储物点会有一些东西,同时它们之间存在距离. 每次给个区间 \([l,r]\) ,查询把这个区间内所有储物点的东西运到另外一个储物点的代价是 ...

  8. 测试右移:线上质量监控 ELK 实战

    目录 [测试右移]介绍 ELK Stack 介绍 ELK 监控体系搭建 ES & Kibana 搭建 Nginx 日志自动采集 Nginx Agent 安装 Nginx 服务器 数据分析 Lo ...

  9. 聊聊 Netty 那些事儿之 Reactor 在 Netty 中的实现(创建篇)

    本系列Netty源码解析文章基于 4.1.56.Final版本 在上篇文章<聊聊Netty那些事儿之从内核角度看IO模型>中我们花了大量的篇幅来从内核角度详细讲述了五种IO模型的演进过程以 ...

  10. 2022省选前联考 AVL树/平衡树

    题目描述 pks 得到了一棵 \(N\) 个节点,权值为 \(1\sim N\) 的 \(AVL\) 树,他觉得这棵树太大了,于是他想要删掉一些节点使得最后剩下的树恰好有 \(K\) 个节点.如果 p ...