题解:CF724G Xor-matic Number of the Graph

news/2025/3/27 3:24:26/文章来源:https://www.cnblogs.com/JPGOJCZX/p/18790558

节选自:线性代数学习笔记(二):线性基

我们先不考虑这道题是在图上操作,因此我们先来求不同异或和的和。

由于线性基中任意一组基异或起来都互不相同,这大大简化了这个问题,我们只需要统计即可,不需要考虑去重。

我们考虑按位算贡献。假设线性基中有 \(tot\) 个基,其中有 \(k (k > 0)\) 个基的第 \(i\) 位为 \(1\),那么就有 \(tot - k\) 个第 \(i\) 位为 \(0\) 的基。这些第 \(i\) 位为 \(0\) 的基无论选不选都对答案不造成贡献,因此最终这一位的答案一定会乘以 \(2^{tot - k}\)

现在我们考虑第 \(i\) 位为 \(1\)\(k\) 个基,只有当从中选出奇数个基时,才会在这一位上留下一个 \(1\),因此答案是 \(\displaystyle\sum_{0 \leq j \leq k \wedge j \bmod 2 = 1} \binom kj\)

我们考虑二项式定理 \((x + y)^k = \displaystyle\sum_{0 \leq j \leq k} \binom kj x^j y^{k - j}\),由于 \(k > 0\),我们把 \(x, y\) 带成 \(-1\)\(1\),那么 \(0 = \displaystyle\sum_{0 \leq j \leq k} \binom kj (-1)^j\),这个式子在 \(j\) 为偶数时为正,\(j\) 为奇数时为负,于是 \(\displaystyle\sum_{0 \leq j \leq k \wedge j \bmod 2 = 1} \binom kj = \sum_{0 \leq j \leq k \wedge j \bmod 2 = 0} \binom kj\)

因为组合数一行之和 \(\displaystyle 2^k\),那么 \(\displaystyle\sum_{0 \leq j \leq k \wedge j \bmod 2 = 1} \binom kj = 2^{k - 1}\),于是这一位的答案就是 \(2^{tot - 1}\)

很显然,如果 \(k\)\(0\) 那么答案就是 \(0\),因此如果存在一个最高位为 \(i\) 的基,那么答案就会乘以 \(2^{tot - 1}\),那么答案就是 \(\displaystyle\prod_{i = 0}^{\log n} 2^{tot - 1} [w_i \neq 0]\)

回到这道题目,我们需要求不同的路径异或和的和。参考例题十一,我们把所有环插入线性基中,再找到一条主路径,那么最终答案就是线性基中的答案异或上主路径长度,但 \(u\)\(v\) 都是不固定的,如果一对一对枚举,复杂度直接炸了,考虑如何优化。

还是考虑异或相等为 \(0\) 的情况。如果我们随便找一个点作为起点,记录到 \(u\) 的距离 \(dis_u\) 和到 \(v\) 的距离 \(dis_v\),那么 \(u\)\(v\) 的距离就是 \(dis_u \operatorname{xor} dis_v\)

那么现在问题就变成了在集合 \(\{dis_i\}\),中任意选两个数字 \(dis_u, dis_v\),我们求出线性基中异或和的和,再异或上 \(dis_u\)\(dis_v\),加入到答案中就行了。但这样复杂度依然爆炸。

我们继续考虑按位贡献,我们知道线性基如果有一个数第 \(i\) 位上是 \(1\),那么这一位上就有 \(2^{tot - 1}\) 种方式凑出 \(1\)\(2^{tot - 1}\) 种方式凑出 \(0\)。因此无论 \(\{dis_i\}\) 中选出两个数的异或和的第 \(i\) 位为 \(1\) 或者 \(0\),对答案的贡献都是 \(2^{tot - 1}\)。假设 \(\{dis_i\}\) 的大小为 \(siz\),那么总贡献就是 \(2^{tot - 1} \times \displaystyle\frac{siz(siz - 1)}{2}\)

如果线性基中没有数字第 \(i\) 位上是 \(1\),那么无论多少个数异或起来都是 \(0\),因此答案需要乘以 \(2^{tot}\)。其次选出的 \(dis_u\)\(dis_v\) 的第 \(i\) 位上必须一个是 \(0\),一个是 \(1\)。我们假设 \(\{dis_i\}\) 中有 \(cnt\) 个数字第 \(i\) 位上为 \(1\),那么对于答案的贡献就是 \(2^{tot} \times cnt \times (siz - cnt)\)

最后,这道题的图可能不联通,每个连通块分开算即可。

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 9, M = 2e5 + 9, MOD = 1e9 + 7;
struct Edge{int v, w, nex;
} e[M << 1];
int head[N], ecnt;
void addEdge(int u, int v, int w){e[++ecnt] = Edge{v, w, head[u]};head[u] = ecnt;
}
int qpow(int a, int b){int res = 1;while(b > 0){if(b & 1)res = res * a % MOD;a = a * a % MOD;b >>= 1;}return res;
}
int dis[N], n, m, ans, sum;
vector <int> vec;
bool vis[N];
struct Basis{int w[69], tot;void clear(){memset(w, 0, sizeof(w));tot = 0;}void insert(int x){for(int i = 62; ~i; i--){if(x >> i & 1ll){if(w[i])x ^= w[i];else {w[i] = x;tot++;break;}}}}int calc(){int sum = 0, res = 0, siz = vec.size();for(int i = 62; ~i; i--)sum |= w[i];for(int i = 62; ~i; i--){int cnt = 0;for(int j = 0; j < siz; j++)if(vec[j] >> i & 1ll)cnt++;if(sum >> i & 1ll)res = (res + qpow(2, i) % MOD * qpow(2, tot - 1) % MOD * (siz * (siz - 1) / 2 % MOD) % MOD) % MOD;elseres = (res + qpow(2, i) % MOD * qpow(2, tot) % MOD * cnt % MOD * (siz - cnt) % MOD) % MOD;}return res;}
} b;
void dfs(int u){vis[u] = true;vec.push_back(dis[u]);for(int i = head[u]; i; i = e[i].nex){int v = e[i].v;if(vis[v])b.insert(dis[u] ^ dis[v] ^ e[i].w);else {dis[v] = dis[u] ^ e[i].w;dfs(v);}}
}
signed main(){scanf("%lld%lld", &n, &m);for(int i = 1; i <= m; i++){int u, v, w;scanf("%lld%lld%lld", &u, &v, &w);addEdge(u, v, w);addEdge(v, u, w);}for(int i = 1; i <= n; i++){if(!vis[i]){b.clear();vec.clear();dfs(i);ans = (ans + b.calc()) % MOD;}}printf("%lld", ans);return 0;    
}

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

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

相关文章

如何寻找替代FTP传输文件的软件,解决文件传输难题?

FTP因其操作简单、客户端种类多、价格低廉(甚至免费)等优势,受到众多企业的青睐,在全世界范围内得到广泛的应用。但它也面临着一些安全和效率方面的挑战,因此企业都在寻找可平滑替代FTP传输文件的软件。有以下局限性: 1.安全性弱:明文传输,漏洞频发,容易遭到DOS攻击;…

20244205 《Python程序设计》实验一报告

课程:《Python程序设计》 班级: 2442 姓名: 高赫 学号:20244205 实验教师:王志强 实验日期:2025年3月24日 必修/选修: 公选课 1.实验内容 (1).熟悉Python开发环境; (2).练习Python运行、调试技能; (3).编写程序,练习变量和类型、字符串、对象、缩进和注释等; (4).编…

微积分的本质——导数.18790288

本篇为3b1b系列【微积分的本质】笔记 原视频:02-导数的悖论 | 03-用几何来求导 | 04-直观理解链式法则和乘积法则定义导数 这是一个随着时间变化,车辆行驶距离的坐标图在横轴的任何一个点\(t\)上,如果你去查看车的车速表,上面都有一个数字表示当前的车速,但这是如何计算的…

推荐8款 .NET 开源、免费、实用的 Windows 效率软件

前言 今天大姚给大家推荐8款基于 .NET 开源、免费、实用的 Windows 效率软件,开发工作提升利器,希望可以帮助到有需要的小伙伴。 DevToys DevToys是一个专门为开发者设计的Windows工具箱,完全支持离线运行,无需使用许多不真实的网站来处理你的数据,常用功能有:格式化(支…

解密prompt系列51. R1实验的一些细节讨论

DeepSeek R1出来后业界都在争相复现R1的效果,这一章我们介绍两个复现项目SimpleRL和LogicRL,还有研究模型推理能力的Cognitive Behaviour,项目在复现R1的同时还针对R1训练策略中的几个关键点进行了讨论和消融实验,包括DeepSeek R1出来后业界都在争相复现R1的效果,这一章我…

读DAMA数据管理知识体系指南30文件和内容治理

读DAMA数据管理知识体系指南30文件和内容治理1. 方法 1.1. 诉讼应诉手册1.1.1. 电子取证工作一般在发生诉讼的时候进行1.1.2. 指引应明确电子取证的目标环境,并评估当前环境和目标环境之间是否存在差距1.1.3. 应记载电子取证活动生命周期的业务流程,明确电子取证团队的角色和…

为什么springboot的jar可以直接启动

一、讲述 1.SpringBoot提供了一个插件spring-boot-maven-plugin用于把程序打包成一个可执行的jar包。 2.Spring Boot应用打包之后,生成一个Fat jar(jar包中包含jar),包含了应用依赖的jar包和Spring Boot loader相关的 类。 3.java -jar会去找jar中的manifest文件,在那里面找…

折腾笔记[17]-使用rust创建linux系统服务

使用rust内嵌配置文件, 创建新用户并创建linux的service服务;实现后台服务循环打印时间到`/tmp/log_file_service`. Use Rust to embed configuration files, create new users, and create service services for Systemd; Implement a backend service loop to print time to …

[PNPM] 其他包管理器

Yarn Yarn 这个包管理器是在 2016 的时候由 Facebook、Google、Exponent 以及 Tilde 团队共同开发推出的。当时 Yarn 的出现主要是为了解决 npm 在速度、安全性以及一致性方面的一些问题:安装速度确定性:项目A ---> 直接依赖: libraryX(1.0)-----> 间接依赖:librar…

Kioptrix Level_1

Kioptrix Level 1.1 靶场配置 导入靶场时先将vmx后缀文件中的带有ethernet0的配置行全部删除,再导入靶场,添加一个网络适配器即可 信息收集 查找目标主机ip ┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:84:b2:cc, IPv4: 192.168…

20244209韩仕炜《Python程序设计》实验一报告

课程:《Python程序设计》 班级: 2442 姓名:韩仕炜 实验教师:王志强 学号:20244209 实验日期:2025年3月24日 必修/选修:专选课 1. 实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习变量和类型、字符串、对象、缩进和注释等; 4.编写一…