[ARC105F] Lights Out on Connected Graph 题解
1.[ARC126C] Maximize GCD 题解2.[ARC126D] Pure Straight 题解3.[ABC215D] Coprime 2 题解4.CF793F Julia the snail 题解5.CF1845D Rating System 题解6.[JOI 2023 Final] Advertisement 2 题解7.CF1513D GCD and MST 题解8.「JOISC 2016 Day 2」雇佣计划 题解9.[ABC134F] Permutation Oddness 题解10.CF1188D Make Equal 题解11.[ARC096E] Everything on It 题解12.[ARC117D] Miracle Tree 题解13.[JOISC 2014 Day3] 电压 题解14.CF803C Maximal GCD 题解15.CF1787E The Harmonization of XOR 题解16.CF1762D GCD Queries 题解17.[AGC061C] First Come First Serve 题解18.CF1575G GCD Festival 题解19.CF1656D K-good 题解20.CF1823F Random Walk 题解21.[ABC297G] Constrained Nim 2 题解22.CF1762E Tree Sum 题解23.CF1798E Multitest Generator 题解24.P7486 「Stoi2031」彩虹 题解25.CF1485C Floor and Mod 题解26.CF1681E Labyrinth Adventures 题解27.CF1023F Mobile Phone Network 题解28.CF258D Little Elephant and Broken Sorting 题解29.P7485 「Stoi2031」枫 题解30.[AGC030D] Inversion Sum 题解31.CF1815D XOR Counting 题解32.CF1864B Swap and Reverse 题解33.CF1864C Divisor Chain 题解34.CF1174E Ehab and the Expected GCD Problem 题解35.[AGC051B] Bowling 题解36.CF1626F A Random Code Problem 题解37.CF915G Coprime Arrays 题解38.[ABC318E] Sandwiches 题解39.[ABC318G] Typical Path Problem 题解40.CF838D Airplane Arrangements 题解41.[ABC319G] Counting Shortest Paths 题解42.[ABC313F] Flip Machines 题解43.[ABC320F] Fuel Round Trip 题解44.[ARC125B] Squares 题解45.[ARC124C] LCM of GCDs 题解46.[ARC135C] XOR to All 题解47.CF1874C Jellyfish and EVA 题解48.[ARC136C] Circular Addition 题解49.[ARC150D] Removing Gacha 题解50.高橋君 题解51.CF1842G Tenzing and Random Operations 题解52.[ARC167D] Good Permutation 题解53.[AGC061A] Long Shuffle 题解54.[ARC104B] DNA Sequence 题解55.[ARC104C] Fair Elevator 题解56.[ARC104D] Multiset Mean 题解57.[ARC104E] Random LIS 题解58.[ABC327G] Many Good Tuple Problems 题解59.[ARC105C] Camels and Bridge 题解60.[ARC105D] Let's Play Nim 题解61.[ARC105E] Keep Graph Disconnected 题解
62.[ARC105F] Lights Out on Connected Graph 题解
63.[ARC106E] Medals 题解64.[ARC107F] Sum of Abs 题解65.[ARC106F] Figures 题解题意
给定一个
现在通过移除
-
是联通图 -
通过采取如下操作可以使得所有的边变为蓝色:
- 选择一个点
,将与 相邻的所有边变为蓝色
- 选择一个点
对
题解
首先我们可以发现,符合要求的子图
发现联通的要求很难满足,故考虑先计算不考虑联通限制下的答案。
设
考虑对图进行黑白染色,通过枚举白色点集合
其中
下面考虑如何计算联通的方案数。
设
可以发现
若不联通,那么图一定具有至少两个联通块,那么我们可以枚举
时间复杂度
Code
#include <bits/stdc++.h>
typedef long long valueType;
typedef std::vector<valueType> ValueVector;
typedef std::pair<valueType, valueType> ValuePair;
typedef std::vector<ValuePair> PairVector;
namespace MODINT {
constexpr valueType MOD = 998244353;
template<typename T1, typename T2, typename T3 = valueType>
void Inc(T1 &a, T2 b, const T3 &mod = MOD) {
a = a + b;
if (a >= mod)
a -= mod;
}
template<typename T1, typename T2, typename T3 = valueType>
void Dec(T1 &a, T2 b, const T3 &mod = MOD) {
a = a - b;
if (a < 0)
a += mod;
}
template<typename T1, typename T2, typename T3 = valueType>
T1 sum(T1 a, T2 b, const T3 &mod = MOD) {
return a + b >= mod ? a + b - mod : a + b;
}
template<typename T1, typename T2, typename T3 = valueType>
T1 sub(T1 a, T2 b, const T3 &mod = MOD) {
return a - b < 0 ? a - b + mod : a - b;
}
template<typename T1, typename T2, typename T3 = valueType>
T1 mul(T1 a, T2 b, const T3 &mod = MOD) {
return (long long) a * b % mod;
}
template<typename T1, typename T2, typename T3 = valueType>
void Mul(T1 &a, T2 b, const T3 &mod = MOD) {
a = (long long) a * b % mod;
}
template<typename T1, typename T2, typename T3 = valueType>
T1 pow(T1 a, T2 b, const T3 &mod = MOD) {
T1 result = 1;
while (b > 0) {
if (b & 1)
Mul(result, a, mod);
Mul(a, a, mod);
b = b >> 1;
}
return result;
}
constexpr valueType Inv2 = (MOD + 1) / 2;
}// namespace MODINT
using namespace MODINT;
bool check(valueType x, valueType k) {
return x & (1 << (k - 1));
}
valueType lowBit(valueType n) {
return n & -n;
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
valueType N, M;
std::cin >> N >> M;
PairVector edges(M);
for (auto &iter : edges)
std::cin >> iter.first >> iter.second;
valueType const S = 1 << N;
ValueVector count(S, 0);
for (valueType s = 0; s < S; ++s) {
for (valueType i = 0; i < M; ++i) {
auto [u, v] = edges[i];
if (check(s, u) && check(s, v))
Inc(count[s], 1);
}
}
ValueVector G(S, 0), F(S, 0);
for (valueType s = 0; s < S; ++s) {
G[s] = 1;
for (valueType t = s; t > 0; t = (t - 1) & s)
Inc(G[s], pow(2, count[s] - count[t] - count[s ^ t]));
}
for (valueType s = 0; s < S; ++s) {
F[s] = G[s];
for (valueType t = s; t > 0; t = (t - 1) & s)
if (lowBit(t) < lowBit(s ^ t))
Dec(F[s], mul(F[t], G[s ^ t]));
}
std::cout << mul(F[S - 1], Inv2) << std::endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?