题目传送门:CF724G

题意简述:

一张 \(n\) 个点的无向图,边有边权。

定义三元组 \((u,v,w)(1\le u < v\le n)\) 合法当且仅当存在从点 \(u\) 到点 \(v\) 存在一条边权异或和为 \(w\) 的路径,经过多次的边需要算多次。

求所有合法三元组的 \(w\) 值之和对 \(10^9+7\) 取模的值。

题解:

比较简单的线性基和图结合的题目,需要用到线性基的一些基本性质。

对异或线性基在图上的应用稍有了解的同学很快可以发现结论:

  • 对于连通无向图 \(G=(V,E)\) 以及 \(G\) 的一棵生成树 \(T\):
  • \(G\) 中所有环(简单或非简单环)的异或和均可以被生成树中所有返祖边 \((x\to y)\) 对应的环 \((y\sim x\to y)\) 的异或和组成的线性基 \(B\) 表示出来。
  • 点 \(u\) 到点 \(v\) 所有路径的异或和可以被 \(T\) 中 \(u\) 到 \(v\) 的路径的异或和异或上线性基 \(B\) 表示出来。
  • 更进一步地,\(T\) 中 \(u\) 到 \(v\) 的路径的异或和等于 \(u\) 到根的路径的异或和异或 \(v\) 到根的路径的异或和。
  • 所以 \(u\) 到 \(v\) 所有路径的异或和等于 \(d_u\oplus d_v\oplus B\),其中 \(d_x\) 表示 \(x\) 到根的路径的异或和。

对于一对 \((u,v)\),尝试统计 \(d_u\oplus d_v\oplus B\) 中所有数的和。

直接做并不是很好做,考虑按位分开做:

  • 对于线性基 \(B\) 和二进制位 \(w\),有结论:
  • 设 \(B\) 中元素个数为 \(S\),则 \(B\) 可以表示出 \(2^S\) 个不同的数。
  • 如果 \(B\) 中存在二进制第 \(w\) 位为 \(1\) 的数,则那 \(2^S\) 个数中恰有 \(2^{S-1}\) 个数的二进制第 \(w\) 位为 \(1\),另外 \(2^{S-1}\) 个数的二进制第 \(w\) 位为 \(0\)。
  • 如果 \(B\) 中不存在二进制第 \(w\) 位为 \(1\) 的数,显然不可能表示出二进制第 \(w\) 位为 \(1\) 的数,全部 \(2^S\) 个数的二进制第 \(w\) 位均为 \(0\)。

    可以通过组合恒等式 \(\sum_{i=0}^{n}\binom{n}{i}[i\bmod 2=1]=\begin{cases}0&,n=0\\2^{n-1}&,n>0\end{cases}\) 证明。

统计每一位有多少种能被表示出来的方式,统计进答案即可。

这样需要枚举 \((u,v)\),其实很简单就能优化。

直接枚举二进制位 \(w\),考虑线性基 \(B\) 中是否存在二进制第 \(w\) 位为 \(1\) 的数。

如果存在,这意味着无论 \(d_u,d_v\) 的二进制第 \(w\) 位是否为 \(1\),都恰有 \(2^{S-1}\) 条使得异或和的二进制第 \(w\) 位为 \(1\) 的路径。

这意味着 \(u,v\) 可以随便选,对答案的贡献为 \(2^w2^{S-1}\binom{n}{2}\)。

如果不存在,这意味着 \(d_u,d_v\) 的二进制第 \(w\) 位必须恰有一个为 \(1\),并且此时存在 \(2^S\) 条使得异或和的二进制第 \(w\) 位为 \(1\) 的路径。

这意味着 \(d_u,d_v\) 的第 \(w\) 位必须恰有一个为 \(1\),记第 \(w\) 位为 \(1\) 的 \(d_x\) 的个数为 \(x\),对答案的贡献为 \(2^w2^Sx(n-x)\)。

最后注意原图不一定联通,对于每个联通块分别计算即可。

时间复杂度 \(\mathcal{O}(n\log^2t_i)\)。

#include <cstdio>
#include <cstring> typedef long long LL;
const int Mod = 1000000007;
const int MN = 100005;
const int MM = 400005; int N, M;
int h[MN], nxt[MM], to[MM], tot; LL w[MM];
inline void ins(int x, int y, LL z) { nxt[++tot] = h[x], to[tot] = y, w[tot] = z, h[x] = tot; } LL B[60]; int C;
inline void Add(LL x) {
for (int j = 59; ~j; --j) if (x >> j & 1)
if (!B[j]) { B[j] = x, ++C; break; }
else x ^= B[j];
} bool vis[MN];
LL d[MN];
int s[MN], t; void DFS(int u, LL v) {
vis[u] = 1, d[u] = v, s[++t] = u;
for (int i = h[u]; i; i = nxt[i]) {
if (vis[to[i]]) Add(v ^ d[to[i]] ^ w[i]);
else DFS(to[i], v ^ w[i]);
}
} LL Ans; int main() {
scanf("%d%d", &N, &M);
for (int i = 1; i <= M; ++i) {
int x, y; LL z;
scanf("%d%d%lld", &x, &y, &z);
ins(x, y, z); ins(y, x, z);
}
for (int i = 1; i <= N; ++i) if (!vis[i]) {
memset(B, 0, sizeof B), C = t = 0;
DFS(i, 0);
for (int j = 0; j < 60; ++j) {
LL c = (1ll << j) % Mod;
bool ok = 0;
for (int k = 0; k < 60; ++k) if (B[k] >> j & 1) ok = 1;
if (ok) Ans = (Ans + (LL)t * (t - 1) / 2 % Mod * ((1ll << C - 1) % Mod) % Mod * c) % Mod;
else {
int x = 0;
for (int i = 1; i <= t; ++i) if (d[s[i]] >> j & 1) ++x;
Ans = (Ans + (LL)x * (t - x) % Mod * ((1ll << C) % Mod) % Mod * c) % Mod;
}
}
}
printf("%d\n", (LL)Ans % Mod);
return 0;
}

CodeForces 724G: Xor-matic Number of the Graph的更多相关文章

  1. CodeForces - 724G:Xor-matic Number of the Graph

    两点之间的任意路径都可表示为  随便某一条路径xor任何多个环, 然后可以用线性基来做,这样不会重复的, 另外必须一位一位的处理,xor是不满足结合律的 #include<cstdio> ...

  2. Codeforces 724 G Xor-matic Number of the Graph 线性基+DFS

    G. Xor-matic Number of the Graph http://codeforces.com/problemset/problem/724/G 题意:给你一张无向图.定义一个无序三元组 ...

  3. Codeforces Round #485 (Div. 2) F. AND Graph

    Codeforces Round #485 (Div. 2) F. AND Graph 题目连接: http://codeforces.com/contest/987/problem/F Descri ...

  4. CF 724 G. Xor-matic Number of the Graph

    G. Xor-matic Number of the Graph 链接 题意: 给定一个无向图,一个interesting的三元环(u,v,s)满足,从u到v的路径上的异或和等于s,三元环的权值为s, ...

  5. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) G - Xor-matic Number of the Graph 线性基好题

    G - Xor-matic Number of the Graph 上一道题的加强版本,对于每个联通块需要按位算贡献. #include<bits/stdc++.h> #define LL ...

  6. Codeforces 1109D. Sasha and Interesting Fact from Graph Theory

    Codeforces 1109D. Sasha and Interesting Fact from Graph Theory 解题思路: 这题我根本不会做,是周指导带飞我. 首先对于当前已经有 \(m ...

  7. CodeForces 840B - Leha and another game about graph | Codeforces Round #429(Div 1)

    思路来自这里,重点大概是想到建树和无解情况,然后就变成树形DP了- - /* CodeForces 840B - Leha and another game about graph [ 增量构造,树上 ...

  8. Codeforces 724G - Xor-matic Number of the Graph(线性基)

    Codeforces 题目传送门 & 洛谷题目传送门 一道还算不套路的线性基罢-- 首先由于图不连通,并且不同连通块之间的点显然不可能产生贡献,因此考虑对每个连通块单独计算贡献.按照 P415 ...

  9. Codeforces.724G.Xor-matic Number of the Graph(线性基)

    题目链接 \(Description\) 给定一张带边权无向图.若存在u->v的一条路径使得经过边的边权异或和为s(边权计算多次),则称(u,v,s)为interesting triple(注意 ...

随机推荐

  1. win10与Ubantu双系统:Linux下开启FTP服务器与创建无线热点(实现文件共享)

    如何在win系统下使用filelizza这个软件搭建FTP服务器,然后建立一个无线局域网,让平板终端连接以后,访问电脑硬盘的文件. 如果是只在win7环境下,一切都很简单,按照上文提供的教程就可以实现 ...

  2. [BZOJ2733][HNOI2010]永无乡 解题报告 启发式合并,线段树合并

    好久没更新博客了,前段时间一直都在考试,都没时间些,现在终于有点闲了(cai guai)... 写了一道题,[HNOI2012]永无乡,其实是一道板子题,我发现我写了好多板子题...还是太菜了... ...

  3. 正确理解 LEAL (Load Effective Address) 指令

    LEAL: leal S, D    ->    D ← &S 在 CSAPP (Computer Systems: A Programmer’s Perspective) 中,对 LE ...

  4. Java中的三目运算符可能出现的问题

    你真的了解Java中的三目运算符吗? 原创 2018-04-27 刨根问底的 Hollis Hollis Hollis 微信号 hollischuang 功能介绍 一个对Coding有着独特追求的人. ...

  5. Android6.0 org.apache.http.util.EncodingUtils等相关类被移除(转)

    ref: Android6.0 org.apache.http.util.EncodingUtils等相关类被移除 - 博客频道 - CSDN.NEThttp://blog.csdn.net/u012 ...

  6. 【贪心】【CF1061D】 TV Shows

    Description 给定 \(n\) 个电视节目和两个参数 \(x,y\).你想要看全部的电视节目,但是同一个电视机同一个时刻只能播放一个电视节目,所以你只能多租赁电视机.在时间 \([l,r]\ ...

  7. laravel 获取所有表名

    $tables = DB::connection()->getDoctrineSchemaManager()->listTableNames(); 需要 doctrine/dbal 扩展, ...

  8. 使用tkinter做简单计算器

    代码如下: from tkinter import * #导入tkinter库 root =Tk() #给窗体 root.title('calculator') #设置窗体名字 frm=Frame(r ...

  9. Hadoop生态圈-HBase的HFile创建方式

    Hadoop生态圈-HBase的HFile创建方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 废话不多说,直接上代码,想说的话都在代码的注释里面. 一.环境准备 list cr ...

  10. Hadoop基础-Idea打包详解之手动添加依赖(SequenceFile的压缩编解码器案例)

    Hadoop基础-Idea打包详解之手动添加依赖(SequenceFile的压缩编解码器案例) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.编辑配置文件(pml.xml)(我 ...