题目描述

给你一个无向图,有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就不用异或了),所以剩下的数怎么组合都没有关系,方案数肯定是那么多

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

 1 //minamoto
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstring>
 5 #define ll long long
 6 using namespace std;
 7 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
 8 char buf[1<<21],*p1=buf,*p2=buf;
 9 inline ll read(){
10     #define num ch-'0'
11     char ch;bool flag=0;ll res;
12     while((ch=getc())>'9'||ch<'0')
13     (ch=='-')&&(flag=true);
14     for(res=num;(ch=getc())<='9'&&ch>='0';res=res*10+num);
15     (flag)&&(res=-res);
16     #undef num
17     return res;
18 }
19 const int N=4e5+5,mod=1e9+7;
20 ll ans;
21 int n,m,top,cnt,cir,u,v;ll e;
22 int head[N],q[N],ver[N<<2],Next[N<<2],tot;ll edge[N<<2];
23 ll b[105],bin[105],circle[N],dis[N],dig[2];
24 inline void add(int u,int v,ll e){
25     ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e;
26 }
27 void dfs(int u,int fa,ll d){
28     dis[u]=d,q[++top]=u;
29     for(int i=head[u];i;i=Next[i]){
30         int v=ver[i];
31         if(v!=fa){
32             if(dis[v]==-1) dfs(v,u,dis[u]^edge[i]);
33             else circle[++cir]=dis[u]^dis[v]^edge[i];
34         }
35     }
36 }
37 inline void insert(ll x){
38     for(int i=63;i>=0;--i)
39     if(x>>i&1){
40         if(!b[i]) return (void)(b[i]=x,++cnt);
41         x^=b[i];
42     }
43 }
44 void init(){
45     memset(b,0,sizeof(b)),cnt=0;
46     for(int i=1;i<=cir;++i) insert(circle[i]);
47 }
48 void calc(){
49     init();
50     for(int j=0;j<=63;++j){
51         bool flag=0;dig[0]=dig[1]=0;
52         for(int i=1;i<=top;++i) dig[dis[q[i]]>>j&1]++;
53         for(int i=0;i<=63;++i)
54         if(b[i]>>j&1){flag=1;break;}
55         ll res;
56         if(flag){
57             res=(dig[0]*(dig[0]-1)/2+dig[1]*(dig[1]-1)/2)%mod;
58             if(cnt) (res*=bin[cnt-1])%=mod;
59             (res*=bin[j])%=mod;
60             (ans+=res)%=mod;
61         }
62         res=dig[0]*dig[1]%mod;
63         if(flag){if(cnt) (res*=bin[cnt-1])%=mod;}
64         else (res*=bin[cnt])%=mod;
65         (res*=bin[j])%=mod;
66         (ans+=res)%=mod;
67     }
68 }
69 int main(){
70 //    freopen("testdata.in","r",stdin);
71     memset(dis,-1,sizeof(dis));
72     bin[0]=1;for(int i=1;i<=63;++i) bin[i]=(bin[i-1]<<1)%mod;
73     n=read(),m=read();
74     for(int i=1;i<=m;++i){
75         u=read(),v=read(),e=read();
76         add(u,v,e),add(v,u,e);
77     }
78     for(int i=1;i<=n;++i)
79     if(dis[i]==-1)
80     top=cir=0,dfs(i,0,0),calc();
81     printf("%lld\n",ans);
82     return 0;
83 }

转载于:https://www.cnblogs.com/bztMinamoto/p/9720166.html

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. 【HDU3949 + BZOJ2115 + CF724G】【异或线性基例题】| 倍增 | 第k小异或和 | DFS处理环 |【CGWR】| N

    三道关于异或线性基的有趣的题目 [1] HDU 3949. XOR Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/3276 ...

  3. 【2019牛客暑期多校训练营(第一场) - H】XOR(线性基,期望的线性性)

    题干: 链接:https://ac.nowcoder.com/acm/contest/881/H 来源:牛客网 Bobo has a set A of n integers a1,a2,-,ana1, ...

  4. 2017 ICPC西安区域赛 A - XOR (线段树并线性基)

    链接:https://nanti.jisuanke.com/t/A1607 题面: Consider an array AA with n elements . Each of its element ...

  5. HDU3949 XOR (线性基、查找第k小值)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 我们用高斯消元求出的a1,a2,-,ana_1,a_2, \dots,a_na1​,a2​,-,an​ ...

  6. 【BZOJ2115】[Wc2011] Xor 高斯消元求线性基+DFS

    [BZOJ2115][Wc2011] Xor Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ...

  7. BZOJ2115:[WC2011] Xor(线性基)

    Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...

  8. 牛客练习赛26 D xor序列 (线性基)

    链接:https://ac.nowcoder.com/acm/contest/180/D 来源:牛客网 xor序列 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他 ...

  9. 2019牛客多校第四场 B xor (线性基求交)

    xor 思路 题目是要求[l,r][l, r][l,r]的所有集合是否都可以得到xxx,那么显然我们可以对这[l,r][l, r][l,r]个线性基求交,然后再特判能否xxx能否插入,如果能插入,显然 ...

最新文章

  1. TTCN-3 编码解码相关模块引入2
  2. #模拟触手机屏幕_从操作系统的改变谈手机设计进化,单手并不是最终的便捷...
  3. python中ndarray和matrix
  4. AI:2020年6月23日北京智源大会顶级大佬邝子平、李开复 、陆奇、张亚勤、曹勖文进行云上圆桌论坛《探讨AI与创业》
  5. .+filename的作用
  6. 如何高效学习算法【实例 + 可视化】
  7. 算法导论读书笔记(7)
  8. TightVNC进行远程控制
  9. 直方图匹配的数学原理
  10. 可孚医疗的数字化突围
  11. 【刷题】BZOJ 2069 [POI2004]ZAW
  12. php无版权图库api,哪里有无版权php源码
  13. RewriteCond 和RewriteRule
  14. centos7FastDFS分布式安装部署
  15. 最炫丽的网页平面UI课程就在广州传智播客
  16. 数据分析 互联网 常用缩写大全(未完待续)
  17. 【Tracker】KCF跟踪方法百度翻译
  18. 英语四级词汇:四级词组百词大关
  19. sp工具中最疼的是_阴阳师手游:SP鬼切技能PV分析:双形态附加协战?鬼兵部恐成最惨御灵...
  20. 入门学习次世代游戏3D建模,你必须弄懂这10件事情

热门文章

  1. Android更新带进度条的通知栏
  2. 烂泥:学习ssh之ssh无密码登陆
  3. w命令、vmstat命令、top命令、sar命令、noload命令
  4. 微信公众号开发Django-网页授权
  5. C#和Javascript间互转的Xxtea加解密
  6. Laravel 集成 JPush 极光推送指北
  7. STL--Lambdas(二)
  8. 【HTML】行内元素与块级元素
  9. IT部门在企业信息化中的转变
  10. eclipse 工程复制