题目大意:给你一张$n(n\leqslant10^5)$个点$m(m\leqslant3\times10^5)$条边的无向图,每条边有一个权值,$q(q\leqslant2^{18})$次询问,每次询问给你一个$x(x<2^{18})$,问有多少个有序点对$(u,v)$,满足有一条$u$到$v$的路径异或和为$x$

题解:先建一棵生成树,把图中所有环丢进线性基,发现一条$u->v$的路径就是树上$u->v$的距离异或上一些环。

发现$x<2^{18}$,所以可以把线性基中所有可以表示出来的数求出来为集合$S$,令多项式$A(x)$,满足$[x^n]A(x)=\sum\limits_{i=1}^n[dis_i=n]$;令多项式$B(x)$,满足$[x^n]B(x)=[n\in S]$,$dis_i$表示第$i$个点到根的路径异或值

然后答案就是$A*A*B$,$*$表示异或卷积

卡点:

C++ Code:

#include <cstdio>
#include <iostream>
#define maxn 100010
#define maxm 300010
#define N 262144
const int mod = 998244353; int head[maxn], cnt;
struct Edge {
int to, nxt, w;
} e[maxm << 1];
inline void addedge(int a, int b, int c) {
e[++cnt] = (Edge) { b, head[a], c }; head[a] = cnt;
e[++cnt] = (Edge) { a, head[b], c }; head[b] = cnt;
} long long A[N], B[N];
namespace Base {
#define M 18
int p[M + 1];
inline void insert(int x) {
for (int i = M; ~i; --i) if (x >> i & 1) {
if (p[i]) x ^= p[i];
else { p[i] = x; break; }
}
}
void dfs(int dep, int val) {
if (dep > M) {
++B[val];
return ;
}
dfs(dep + 1, val);
if (p[dep]) dfs(dep + 1, val ^ p[dep]);
}
#undef M
} int n, m, q;
int dis[maxn];
bool vis[maxn];
void dfs(int u, int fa = 0) {
vis[u] = true;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (!vis[v]) {
dis[v] = dis[u] ^ e[i].w;
dfs(v, u);
} else Base::insert(dis[u] ^ dis[v] ^ e[i].w);
}
} const int lim = N;
inline void FWT(long long *A) {
for (register int mid = 1; mid < lim; mid <<= 1)
for (register int i = 0; i < lim; i += mid << 1)
for (register int j = 0; j < mid; ++j) {
const long long X = A[i + j], Y = A[i + j + mid];
A[i + j] = X + Y, A[i + j + mid] = X - Y;
}
} int main() {
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
std::cin >> n >> m >> q;
for (int i = 0, a, b, c; i < m; ++i) {
std::cin >> a >> b >> c;
addedge(a, b, c);
}
dfs(1), Base::dfs(0, 0);
for (int i = 1; i <= n; ++i) ++A[dis[i]];
FWT(A), FWT(B);
for (int i = 0; i < lim; ++i) A[i] = A[i] * A[i] * B[i];
FWT(A);
for (int i = 0; i < lim; ++i) A[i] >>= 18;
while (q --> 0) {
static int x;
std::cin >> x;
std::cout << A[x] % mod << '\n';
}
return 0;
}

[洛谷P5169]xtq的异或和的更多相关文章

  1. ⌈洛谷4735⌋⌈BZOJ3261⌋最大异或和【可持久化01Trie】

    题目链接 [BZOJ传送门] [洛谷传送门] 题解 终于学会了可持久化trie树了.感觉并不是特别的难. 因为可持久化,那么我们就考虑动态开点的trie树. 都知道异或操作是有传递性的,那么我们就维护 ...

  2. 洛谷 [P2420] 让我们异或吧

    某两点之间的路径上所有边权的异或值即dis1^dis2--^disn. 由于x^y^y=x,所以dfs预处理出每一点到根节点的异或值,对于每次询问,直接输出 disu^disv. #include & ...

  3. 洛谷P4551 最长异或路径

    传送门:https://www.luogu.org/problem/show?pid=4551 在看这道题之前,我们应懂这道题怎么做:给定n个数和一个数m,求m和哪一个数的异或值最大. 一种很不错的做 ...

  4. 洛谷 P2420 让我们异或吧 解题报告

    P2420 让我们异或吧 题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中-xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B ...

  5. 【洛谷P4735】最大异或和

    题目大意:给定一个长度为 N 的序列,支持两个操作:在序列末尾添加一个新的数字,查询序列区间 \([l,r]\) 内使得 \(a_p\oplus a_{q+1}\oplus ... a_N\oplus ...

  6. 2018.10.26 洛谷P4551 最长异或路径(01trie)

    传送门 直接把每个点到根节点的异或距离插入01trie. 然后枚举每个点在01trie上匹配来更新答案就行了. 代码: #include<iostream> #include<cst ...

  7. 【洛谷 P4735】 最大异或和 (可持久化Trie)

    题目链接 维护整个数列的异或前缀和和\(s\),然后每次就是要求\(s[N]\text{^}x\text{^}s[k],l-1<=k<=r-1\)的最大值 如果没有\(l\)的限制,那么直 ...

  8. 洛谷P2420 让我们异或吧(树链剖分)

    题目描述异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是否是男生)=A和B是否能够 ...

  9. [洛谷P2420] 让我们异或吧

    题目链接:让我们异或吧 题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是 ...

随机推荐

  1. 安装wamp后,其显示目录的图标显示不出来

    解决办法:wamp的安装目录中,到 wamp\bin\apache\Apache2.2.21\conf \extra下打开httpd-autoindex.conf文件,这里是索引文件图标的配置文件.修 ...

  2. android分析windowManager、window、viewGroup之间关系(二)

    三.接上一节,分析windowManager中添加一个悬浮框的方式,首先看代码 WindowManager.LayoutParams params = new LayoutParams(); para ...

  3. SpringMVC+mybatis+maven+Ehcache缓存实现

    所谓缓存,就是将程序或系统经常要调用的对象存在内存中,以便其使用时可以快速调用,不必再去创建新的重复的实例.这样做可以减少系统开销,提高系统效率. 缓存主要可分为二大类: 一.通过文件缓存,顾名思义文 ...

  4. unity发布自定义分辨率

    如果你需要发布unity时想要使用自己设置的分辨率仅需要一下几个步骤: 打开Build Setting->PlayerSetting->Resolution and Presentatio ...

  5. [JSON].exists( keyPath )

    语法:[JSON].exists( keyPath ) 返回:[True | False] 说明:检测指定键名路径是否存在 示例: Set jsonObj = toJson("{div:{' ...

  6. 数据库Mysql的学习(六)-子查询和多表操作

    )*0.05 WHERE card_id ='20121xxxxxx'; //子查询就是一个嵌套先计算子查询 SELECT * FROM borrow WHERE book_id =(SELECT b ...

  7. [HNOI2017]影魔

    题意: 给定 \(n\) 个数的排列,\(m\) 次询问,每次询问询问一个区间内所有子区间的贡献. 每个区间如果两个端点分别是最大值和次大值,我们就算 \(P1\) 的贡献. 如果两个端点一个是最大值 ...

  8. ThinkPHP - 3 - IDE选择以及Eclipse PDT打开ThinkPHP项目

    ThinkPHP框架已部署到SAE(新浪云),且代码已获取到本地.眼前面临的问题就是,对ThinkPHP项目选择哪种开发工具(IDE)? 经过简单的查找比较,以及电脑里已装有Eclipse的因素,遂决 ...

  9. Centos6设置DNS

    通过编辑 vi /etc/resolv.conf 设置首选DNS和次要DNS.如下,排在前面的就是首选DNS,后面一行就是次要的DNS服务器DNS vi /etc/resolv.conf namese ...

  10. NFC进场通信总结概述

    简介 本文介绍Nokia设备所支持的近场通信技术(NFC)及相关的功能.旨在为使用 Qt/Symbian/Java™ API为Nokia手机开发应用的开发者 刚开始接触NFC开发时提供有用的信息. 什 ...