Codeforces 724G - Xor-matic Number of the Graph(线性基)
一道还算不套路的线性基罢……
首先由于图不连通,并且不同连通块之间的点显然不可能产生贡献,因此考虑对每个连通块单独计算贡献。按照 P4151 的套路可以对每个连通块先找出它的一棵生成树,记 \(d_u\) 为 \(u\) 到生成树树根上所有边权值的异或和。对于生成树上所有非树边 \((u,v,w)\),\(u\to v\) 在树上的路径与这条边本身显然会形成一个环,且环的权值为 \(d_u\oplus d_v\oplus w\),我们将这个环插入线性基。那么对于该联通块中的两点 \(u,v\),所有 \(u\to v\) 路径本质不同的异或和都可以写成 \(d_u\oplus d_v\oplus x\) 的形式,其中 \(x\) 可以表示为线性基中向量的线性组合。
显然暴力枚举 \(u,v\) 是不可行的,考虑换个方式计算贡献,对于每一个二进制位 \(2^p\),我们计算有多少个 \(u,v,S\) 满足 \(d_u\oplus d_v\oplus\operatorname{xor}\limits_{x\in S}x\) 的 \(2^p\) 位为 \(1\),那么会产生 \(2^p\times\text{满足条件的三元组}(u,v,S)\text{的个数}\) 的贡献。那么这个贡献怎么计算呢?分两种情况,设线性基为 \(b_1,b_2,\cdots,b_m\),那么:
- 如果 \(\exist i\) 满足 \(b_i\) 的 \(2^p\) 位为 \(1\),那么不论剩下 \(m-1\) 个数选不选,我们总可以控制 \(b_i\) 的选/不选来实现 \(2^p\) 的第 \(i\) 位为 \(1\),因此可以表示为 \(\operatorname{xor}\limits_{x\in S}x\) 的形式,并且 \(2^p\) 位为 \(1\) 的数的个数为 \(2^{p-1}\)。而根据线性基的性质,对于所有可以表示 \(\operatorname{xor}\limits_{x\in S}x\) 的形式的 \(y\),都恰好存在 \(2^{t-m}\) 个集合 \(S\) 满足 \(\operatorname{xor}\limits_{x\in S}x=y\),其中 \(t\) 为非树边个数。也就是说不论 \(u,v\) 是什么,总有 \(2^{t-1}\) 个集合 \(S\) 满足 \(d_u\oplus d_v\oplus\operatorname{xor}\limits_{x\in S}x\) 的 \(2^p\) 位为 \(1\),因此符合条件的 \(u,v,S\) 的个数为 \(2^{t-1}\times\dbinom{n}{2}\)。
- 否则不论 \(S\) 是什么,都有 \(\operatorname{xor}\limits_{x\in S}x\) 的 \(2^p\) 位为 \(0\),故 \((u,v,S)\) 符合条件当且仅当 \(d_u,d_v\) 的 \(2^p\) 位的值不同,开个桶统计下有多少个 \(u\) 满足 \(d_u\) 的 \(2^p\) 位为 \(0\),贡献即为 \(2^t\times d_p\times(siz-d_p)\),其中 \(siz\) 为连通块大小。
剩下的就是乱搞搞的事了,时间复杂度 \(n\log^2v\),其中 \(v\) 为值域大小。
const int MAXN=1e5;
const int MAXM=2e5;
const int MAXB=60;
const int MOD=1e9+7;
const int INV2=5e8+4;
int n,m,cnt=0,num[MAXB+5];ll a[MAXB+5];
int hd[MAXN+5],to[MAXM*2+5],nxt[MAXM*2+5],ec=0;ll val[MAXM*2+5];
void adde(int u,int v,ll w){to[++ec]=v;val[ec]=w;nxt[ec]=hd[u];hd[u]=ec;}
void init(){memset(a,0,sizeof(a));cnt=0;}
void ins(ll x){
for(int i=MAXB;~i;i--) if(x>>i&1){
if(!a[i]){++cnt;a[i]=x;return;}
else x^=a[i];
}
}
bitset<MAXN+5> vis;
ll dis[MAXN+5];vector<int> v;
void dfs(int x,ll cur){
dis[x]=cur;vis[x]=1;v.pb(x);
for(int e=hd[x];e;e=nxt[e]){
int y=to[e];ll z=val[e];
if(!vis[y]) dfs(y,cur^z);
else ins(dis[x]^dis[y]^z);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int u,v;ll w;scanf("%d%d%lld",&u,&v,&w);
adde(u,v,w);adde(v,u,w);
}
int ans=0;
for(int i=1;i<=n;i++) if(!vis[i]){
init();memset(num,0,sizeof(num));v.clear();dfs(i,0);
for(int j=0;j<=MAXB;j++) for(int u:v)
if(dis[u]>>j&1) num[j]++;
for(int j=0;j<=MAXB;j++){
bool flg=0;
for(int k=0;k<=MAXB;k++) if(a[k]>>j&1) flg=1;
if(flg) ans=(ans+(1ll<<j)%MOD*((1ll<<cnt-1)%MOD)%MOD*v.size()%MOD*(v.size()-1)%MOD*INV2)%MOD;
else ans=(ans+(1ll<<j)%MOD*((1ll<<cnt)%MOD)%MOD*num[j]%MOD*(v.size()-num[j]))%MOD;
}
} printf("%d\n",ans);
return 0;
}
Codeforces 724G - Xor-matic Number of the Graph(线性基)的更多相关文章
- Codeforces 724 G Xor-matic Number of the Graph 线性基+DFS
G. Xor-matic Number of the Graph http://codeforces.com/problemset/problem/724/G 题意:给你一张无向图.定义一个无序三元组 ...
- CodeForces - 724G:Xor-matic Number of the Graph
两点之间的任意路径都可表示为 随便某一条路径xor任何多个环, 然后可以用线性基来做,这样不会重复的, 另外必须一位一位的处理,xor是不满足结合律的 #include<cstdio> ...
- Codeforces.724G.Xor-matic Number of the Graph(线性基)
题目链接 \(Description\) 给定一张带边权无向图.若存在u->v的一条路径使得经过边的边权异或和为s(边权计算多次),则称(u,v,s)为interesting triple(注意 ...
- 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 ...
- codeforces 724G - Xor-matic Number of the Graph 线性基+图
题目传送门 题意:给出衣服无向带权图,问有多少对合法的$<u,v,s>$,要求$u$到$v$存在一条路径(不一定是简单路径)权值异或和等于$s$,并且$u<v$.求所有合法三元组的s ...
- codeforces 1101G (Zero XOR Subset)-less 前缀异或+线性基
题目传送门 题意:给出一个序列,试将其划分为尽可能多的非空子段,满足每一个元素出现且仅出现在其中一个子段中,且在这些子段中任取若干子段,它们包含的所有数的异或和不能为0. 思路:先处理出前缀异或,这样 ...
- Educational Codeforces Round 58 (Rated for Div. 2) G 线性基
https://codeforces.com/contest/1101/problem/G 题意 一个有n个数字的数组a[],将区间分成尽可能多段,使得段之间的相互组合异或和不等于零 题解 根据线性基 ...
- Codeforces.472F.Design Tutorial: Change the Goal(构造 线性基 高斯消元)
题目链接 \(Description\) 给定两个长为\(n\)的数组\(x_i,y_i\).每次你可以选定\(i,j\),令\(x_i=x_i\ \mathbb{xor}\ x_j\)(\(i,j\ ...
- bzoj 2115 [Wc2011] Xor 路径最大异或和 线性基
题目链接 题意 给定一个 \(n(n\le 50000)\) 个点 \(m(m\le 100000)\) 条边的无向图,每条边上有一个权值.请你求一条从 \(1\)到\(n\)的路径,使得路径上的边的 ...
- bzoj2115 [Wc2011] Xor——高斯消元 & 异或线性基
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2115 异或两次同一段路径的权值,就相当于没有走这段路径: 由此可以得到启发,对于不同的走法, ...
随机推荐
- clock时钟
①时钟的偏移(skew):时钟分支信号在到达寄存器的时钟端口过程中,都存在有线网等延时,由于延时,到达寄存器时钟端口的时钟信号存在有相位差,也就是不能保证每一个沿都对齐,这种差异称为时钟偏移(cloc ...
- c语言中for循环 和嵌套for循环
for循环:for( ; ; )里面是bai3个语句,两个分号.第一个语句是开始前执行,第二个语句是判断真假,如果真,就执行后面(大括号内)的代码.第三个语句是每次执行完毕后执行的东西,通常第三个语句 ...
- Less-23 preg_replace1
Less-23: 直接跳到Less-23的原因是,Less-(11~22)均为注入点不为get方式的注入.我先把get型注入写的差不多,再回来整理关于注入点的内容. 核心语句: 查询.报错均有回显. ...
- 联想SR658安装显卡驱动【NVIDIA Tesla V100】
1. 安装基础依赖环境 yum -y install gcc kernel-devel kernel-headers 2.查看内核和源码版本是否一致 查看内核版本: ls /boot | grep v ...
- Coursera Deep Learning笔记 改善深层神经网络:超参数调试 Batch归一化 Softmax
摘抄:https://xienaoban.github.io/posts/2106.html 1. 调试(Tuning) 超参数 取值 #学习速率:\(\alpha\) Momentum:\(\bet ...
- 《Spring源码深度解析》学习笔记——Spring的整体架构与容器的基本实现
pring框架是一个分层架构,它包含一系列的功能要素,并被分为大约20个模块,如下图所示 这些模块被总结为以下几个部分: Core Container Core Container(核心容器)包含有C ...
- Spark面试题(二)
首发于我的个人博客:Spark面试题(二) 1.Spark有哪两种算子? Transformation(转化)算子和Action(执行)算子. 2.Spark有哪些聚合类的算子,我们应该尽量避免什么类 ...
- WPF PropertyChanged实现子属性通知
今天用WPF的View绑定了ViewModel的一个属性类,结果在属性类的子属性修改时,没有通知到UI. 如有要显示一个学生信息,采用WPF MVVM的模式,则前端代码 <StackPanel& ...
- The entitlements specified in your application’s Code Signing Entitlements file do not match those s
今天给打包 TPshop IOS (搜豹商城) ipa文件 调试运行 xcode运行提示这个错误: The entitlements specified in your application's C ...
- Celery Task(定时任务)及参数
celery beat 是一个调度器:它以常规的时间间隔开启任务,任务将会在集群中的可用节点上运行. 默认情况下,入口项是从 beat_schedule 设置中获取,但是自定义的存储也可以使用,例如在 ...