CF724G Xor-matic Number of the Graph(线性基+组合数)
题目描述
给你一个无向图,有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(线性基+组合数)的更多相关文章
- 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(线性基)
题目链接 \(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 ...
- 「CF724G」Xor-matic Number of the Graph「线性基」
题意 求所有点对\(u,v\),\(u\)到\(v\)所有不同的异或路径的异或值之和,对\(10^9+7\)取模 题解 求出一个dfs树,那么\(u\)到\(v\)的路径一定是树上路径异或一些环.这些 ...
- CF724G 【Xor-matic Number of the Graph】
题目就不翻译了吧,应该写的很清楚了... 首先 \(,\) 不懂线性基的可以戳这里.知道了线性基\(,\) 但是从来没有写过线性基和图论相结合的\(,\) 可以戳这里. 好\(,\) 点完了这些前置技 ...
- codeforces 1101G (Zero XOR Subset)-less 前缀异或+线性基
题目传送门 题意:给出一个序列,试将其划分为尽可能多的非空子段,满足每一个元素出现且仅出现在其中一个子段中,且在这些子段中任取若干子段,它们包含的所有数的异或和不能为0. 思路:先处理出前缀异或,这样 ...
- 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 异或两次同一段路径的权值,就相当于没有走这段路径: 由此可以得到启发,对于不同的走法, ...
随机推荐
- EasyDarwin幼教云视频平台在幼教平台领域大放异彩!
在之前的一篇方案<基于EasyDarwin云视频平台的幼儿园视频直播(手机直播/微信直播)解决方案>中,我们提到一种可以广泛应用于幼教.工厂.建筑工地以及各种现场监控的云视频平台方案,这种 ...
- EasyDarwin开源流媒体服务器性能优化之Work-stealing优化方案
本文转自EasyDarwin开源团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/52400226 EasyDarwin团队的Ba ...
- 程序员必知的8大排序(java实现)
先来看看8种排序之间的关系:
- 九度OJ 1111:单词替换 (查找)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4473 解决:1268 题目描述: 输入一个字符串,以回车结束(字符串长度<=100).该字符串由若干个单词组成,单词之间用一个空格隔 ...
- cmake中的变量和命令的大小写
1 cmake中要特别注意命令和变量的大小写 2 cmake的内置命令是不区分大小写的 3 cmake内置变量是区分大小写的,或者干脆就说,cmake的所有变量都是区分大小写的 这就是变量和命令的不同 ...
- mybatis入门小结(六)
入门小结---查询 1.1.1.1.1 #{}和${} #{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以 ...
- Spring 配置JNDI数据源
1.Spring 提供的JNDI调用类. 2.使用weblogic进行部署项目,所以使用WebLogicNativeJdbcExtrator类进行配置. 3.配置完数据源后配置sessionFacto ...
- Android5.0 CheckBox颜色修改
Android5.0开始,CheckBox带有material design动画效果,其默认的样式如下图所示: 可以看到,在上图中,CheckBox的边框为灰色,当被选中后,填充色为绿色. 那么如果我 ...
- 网络抓取功能实现 将获取的结果进行过滤并写入到TXT文档中
下面是自己编写的 网络抓取功能实现 将获取的结果进行过滤并写入到TXT文档中 (以防忘记) 原创哟 import java.io.BufferedReader;import java.io.Buffe ...
- tomcat 启动增加参数
linux: JAVA_OPTS="$JAVA_OPTS -Dconfig.type=inte2 -Xms2048m -Xmx2048m -XX:PermSize=128m -XX:Max ...