题目描述

给你一个无向图,有n个顶点和m条边,每条边上都有一个非负权值。

我们称一个三元组(u,v,s)是有趣的,当且仅当对于u,v,有一条从u到v的路径(可以经过相同的点和边多次),其路径上的权值异或和为 s 。对于一条路径,如果一条边经过了多次,则计算异或和时也应计算多次。不难证明,这样的三元组是有限的。

计算所有有趣的三元组中s的和对于1e9+7的模数

题解

不知道线性基是什么东西的可以看看蒟蒻的总结

线性基神仙题

首先异或和肯定得用线性基

然后路径肯定得找出所有环

那么先dfs一遍,找出到每个点的任意一条路径,然后把所有的环都给扔进线性基里面,

考虑接下来怎么做

经过深(kan)思(le)熟(ti)虑(jie),我们发现每一个连通块里的所有点都要两两统计答案,那么我们要根据xor采取一个方法:二进制逐位统计

假设从大到小考虑第$k$位,此时所有点可以分为两类,第$k$位为0或第$k$位为1

先考虑两个点全0或全1的情况,这种情况下两个点异或起来第$k$位为0,对答案没有贡献,那么只有在线性基里存在第$k$位为1的数,异或上这两个点才能使其对答案有贡献

那么这个基必须选,然后剩下的基有$2^{cnt-1}$种选法($cnt$为线性基里的元素个数),这一位对答案的贡献就是$2^{cnt-1}*2^{k}$

然后不同为0或1的情况同理,这个基必须不能选,剩下的基的选法如上

ps:我上面两个基必须选或不选只是打个比方,真正的意思是把这一个基拿出来,那么如果剩下的异或出来第$k$位是否为0,都能通过异或上这一个数使其第$k$位变为1(如果已经是1就不用异或了),所以剩下的数怎么组合都没有关系,方案数肯定是那么多

然后剩下的……看代码好了

 //minamoto
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline ll read(){
#define num ch-'0'
char ch;bool flag=;ll res;
while((ch=getc())>''||ch<'')
(ch=='-')&&(flag=true);
for(res=num;(ch=getc())<=''&&ch>='';res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
const int N=4e5+,mod=1e9+;
ll ans;
int n,m,top,cnt,cir,u,v;ll e;
int head[N],q[N],ver[N<<],Next[N<<],tot;ll edge[N<<];
ll b[],bin[],circle[N],dis[N],dig[];
inline void add(int u,int v,ll e){
ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e;
}
void dfs(int u,int fa,ll d){
dis[u]=d,q[++top]=u;
for(int i=head[u];i;i=Next[i]){
int v=ver[i];
if(v!=fa){
if(dis[v]==-) dfs(v,u,dis[u]^edge[i]);
else circle[++cir]=dis[u]^dis[v]^edge[i];
}
}
}
inline void insert(ll x){
for(int i=;i>=;--i)
if(x>>i&){
if(!b[i]) return (void)(b[i]=x,++cnt);
x^=b[i];
}
}
void init(){
memset(b,,sizeof(b)),cnt=;
for(int i=;i<=cir;++i) insert(circle[i]);
}
void calc(){
init();
for(int j=;j<=;++j){
bool flag=;dig[]=dig[]=;
for(int i=;i<=top;++i) dig[dis[q[i]]>>j&]++;
for(int i=;i<=;++i)
if(b[i]>>j&){flag=;break;}
ll res;
if(flag){
res=(dig[]*(dig[]-)/+dig[]*(dig[]-)/)%mod;
if(cnt) (res*=bin[cnt-])%=mod;
(res*=bin[j])%=mod;
(ans+=res)%=mod;
}
res=dig[]*dig[]%mod;
if(flag){if(cnt) (res*=bin[cnt-])%=mod;}
else (res*=bin[cnt])%=mod;
(res*=bin[j])%=mod;
(ans+=res)%=mod;
}
}
int main(){
// freopen("testdata.in","r",stdin);
memset(dis,-,sizeof(dis));
bin[]=;for(int i=;i<=;++i) bin[i]=(bin[i-]<<)%mod;
n=read(),m=read();
for(int i=;i<=m;++i){
u=read(),v=read(),e=read();
add(u,v,e),add(v,u,e);
}
for(int i=;i<=n;++i)
if(dis[i]==-)
top=cir=,dfs(i,,),calc();
printf("%lld\n",ans);
return ;
}

CF724G Xor-matic Number of the Graph(线性基+组合数)的更多相关文章

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

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

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

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

  3. 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 ...

  4. codeforces 724G - Xor-matic Number of the Graph 线性基+图

    题目传送门 题意:给出衣服无向带权图,问有多少对合法的$<u,v,s>$,要求$u$到$v$存在一条路径(不一定是简单路径)权值异或和等于$s$,并且$u<v$.求所有合法三元组的s ...

  5. 「CF724G」Xor-matic Number of the Graph「线性基」

    题意 求所有点对\(u,v\),\(u\)到\(v\)所有不同的异或路径的异或值之和,对\(10^9+7\)取模 题解 求出一个dfs树,那么\(u\)到\(v\)的路径一定是树上路径异或一些环.这些 ...

  6. CF724G 【Xor-matic Number of the Graph】

    题目就不翻译了吧,应该写的很清楚了... 首先 \(,\) 不懂线性基的可以戳这里.知道了线性基\(,\) 但是从来没有写过线性基和图论相结合的\(,\) 可以戳这里. 好\(,\) 点完了这些前置技 ...

  7. codeforces 1101G (Zero XOR Subset)-less 前缀异或+线性基

    题目传送门 题意:给出一个序列,试将其划分为尽可能多的非空子段,满足每一个元素出现且仅出现在其中一个子段中,且在这些子段中任取若干子段,它们包含的所有数的异或和不能为0. 思路:先处理出前缀异或,这样 ...

  8. bzoj 2115 [Wc2011] Xor 路径最大异或和 线性基

    题目链接 题意 给定一个 \(n(n\le 50000)\) 个点 \(m(m\le 100000)\) 条边的无向图,每条边上有一个权值.请你求一条从 \(1\)到\(n\)的路径,使得路径上的边的 ...

  9. bzoj2115 [Wc2011] Xor——高斯消元 & 异或线性基

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2115 异或两次同一段路径的权值,就相当于没有走这段路径: 由此可以得到启发,对于不同的走法, ...

随机推荐

  1. Erlang function guards NOTE

    Note: I've compared , and ; in guards to the operators andalso and orelse. They're not exactly the s ...

  2. 基于EasyDarwin云视频平台的幼儿园视频直播(手机直播/微信直播)解决方案

    一.方案介绍 1.1.方案背景 在2016年10月25日至28日的安博会上,我们看到了不少的幼教平台厂商,我们注意到大部分的幼教平台,为了追求极佳的用户体验,在微信或者APP端能够做到极快的打开速度, ...

  3. superslider网站特效插件

    网站上常用的“焦点图/幻灯片”“Tab标签切换”“图片滚动”“无缝滚动” 如何使用 1.引入jquery.js    引入superslider.js 2.编写HTML 以下是默认的HTMl结构,分别 ...

  4. 如何设置Tomcat的JVM虚拟机内存大小

    我的是解压版的tomcat: 首先找到tomcat中bin目录下: catalina.bat 文件,打开这个文件,在 @echo off 下面一行,加上一行代码: set JAVA_OPTS=-ser ...

  5. SpringSecurityLDap

    ldap,用于用户登录的权限管理, 可参考:http://www.cnblogs.com/icuit/archive/2010/06/10/1755575.html

  6. python 基础之第十天(闭包,装饰器,生成器,tarfile与hashlib模块使用)

    局部变量与全局变量 局部变量:在函数里面定义的,只有当函数活动时才生效 全局变量:不在函数里面的 In [1]: x=10 In [2]: def bar(): ...: x=20 ...: prin ...

  7. [HAOI 2012] 外星人

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2749 [算法] 首先 , 每次对一个数x进行操作 , 只会使该数减少一个2的因子 那 ...

  8. POJ2184(01背包变形)

    Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11092   Accepted: 4404 D ...

  9. IOS造成卡顿的主要原因

    1. cellForRowAtIndexPath, 单元格视图重用, 注意尽量让所有视图重用, 只根据单元格row和section的不容更换不同的数据, 而不是每次都生成新的单元格, 这是程序奔溃的前 ...

  10. hibernate 学习 五 hibernate核心接口

    一 Configuration接口 Configuration对象只存在于系统的初始化阶段.配置相关. 配置文件可以使用默认的路径,也可以指定路径. Configuration config = ne ...