首页 > 其他分享 >[题解] P6569 [NOI Online #3 提高组] 魔法值

[题解] P6569 [NOI Online #3 提高组] 魔法值

时间:2023-11-13 10:33:12浏览次数:50  
标签:魔法值 NOI int 题解 mat Read 32 Matrix

P6569 [NOI Online #3 提高组] 魔法值

不放简要题意了,题面写的很简要。

看到数据范围自然可以想到矩阵快速幂优化。但乘法对异或没有分配律。所以直接拆位,把异或变成加法对二取模就有分配律了。

还有一个优化就是提前预处理出矩阵的 2 的幂次方,然后询问时直接二进制分解乘起来就行。

时间复杂度 \(O\left(\dfrac{n^3 \log a + n^2 \log^2 a}{w}\right)\)。

constexpr int MAXN = 1e2 + 9, MAXLG = 32;
int n, m, q;
ui f0[MAXN];

struct Matrix {
	int n, m;
	bitset<MAXN> mat[MAXN];
	
	Matrix() { return; }
	Matrix(int _n, int _m): n(_n), m(_m) {
		for (int i = 1; i <= n; i ++)
			mat[i].reset();
		return;
	}
	friend Matrix operator * (const Matrix &x, const Matrix &y) {
		Matrix ans(x.n, y.m); assert(x.m == y.n);
		for (int i = 1; i <= x.n; i ++)
			for (int j = 1; j <= x.m; j ++)
				if (x.mat[i][j]) ans.mat[i] ^= y.mat[j];
		return ans;
	}
	Matrix& operator *= (const Matrix &x) { return (*this) = (*this) * x; }
} f, G[MAXLG];

void slv() {
	n = Read<int>(), m = Read<int>(), q = Read<int>();
	f = Matrix(1, n);
	for (int i = 1; i <= n; i ++) f0[i] = Read<ui>();
	G[0] = Matrix(n, n);
	for (int i = 1; i <= m; i ++) {
		int u = Read<int>(), v = Read<int>();
		G[0].mat[u][v] = G[0].mat[v][u] = 1;
	}
	for (int i = 1; i < 32; i ++) G[i] = G[i - 1] * G[i - 1];
	while (q --) {
		ui a = Read<ui>();
		ui ans = 0;
		for (int i = 0; i < 32; i ++) {
			Matrix f(1, n);
			for (int j = 1; j <= n; j ++) f.mat[1][j] = f0[j] >> i & 1;
			for (int k = 0; k < 32; k ++) if (a >> k & 1) f *= G[k];
			if (f.mat[1][1]) ans += 1u << i;
		}
		Write(ans, '\n');
	}
	return;
}

标签:魔法值,NOI,int,题解,mat,Read,32,Matrix
From: https://www.cnblogs.com/definieren/p/17828625.html

相关文章

  • ARC119F 题解
    前言ARC119F好厉害,是没见过的自动机DP。正文[1]分析主要分析一下为什么这么写。[2]状态设计[3]自动机状态转移感觉状态设计中最难的就是如何处理带\(O\)的。见参考资料。[4]代码还没写。写ing这是自动机的初始化(有点麻烦)。intto[Kind][2][2]={{{2,0},{8,0......
  • [NOIP2022] 比赛 - 总结
    [NOIP2022]比赛0.问题转化首先需要转化为区间历史和问题。具体上来讲,就是将询问离线后,扫描线维护对于\(r\)来说,每一个\(l\)的\(\sum_{i=l}^{r}(\max_{j=l}^{i}a_j\\cdot\\max_{j=l}^{i}b_j)\)那么答案就是区间和。1.构造信息与标记接下来就是如何维护区间历史和。......
  • ABC328F题解
    原题链接洛谷题面提交记录闲话赛场就做了这道和A,喜提\(625\)大分。带权并查集练手题,有点像银河英雄传说。题目大意存在一个长度为\(N\)的数列\(X\),给定\(Q\)个三元组\((a_i,b_i,d_i)\),定义一个好集合为集合\(S\subseteq\{1,2,\dots,Q\}\),使得所有\(x\inS\)满......
  • 洛谷 NOIP 2023 模拟赛 T2 汪了个汪
    洛谷NOIP2023模拟赛T2汪了个汪考试建出正解图不知道怎么处理,题解区樱雪喵博客薄纱。樱雪喵题解链接Ps:笔者语文爆炸,不建议阅读本文思路首先你会发现,一共有\(\frac{n(n-1)}{2}\)个二元组,有\(\frac{n(n-1)}{2}\)个横向相邻数对。按照题目要求,一个横向数对对应一个二......
  • 题解:[春季测试 2023] 幂次
    题解:[春季测试2023]幂次给定\(n,k\),求有多少个整数\(i\in[1,n]\),满足\(i=a^b(a,b\inN^+,b\geqk)\)算法一\(k\ge3:\)发现只需要筛到1e6就没有贡献了,加上\(set\)暴力判重即可。\(k=2:\)发现有\(\sqrt{n}\)个完全平方数,考虑如何避免算重它们。考虑完全平......
  • Tenzing and Random Operations CF1842G 题解
    设\(m\)次选的位置分别为\(b_{1\simm}\)。于是答案为\(\mathbbE(\prod\limits_{i=1}^{n}(a_i+\sum\limits_{j=1}^{m}[b_j\lei]\cdotv))=\frac{S}{n^m}\)。首先考虑期望很难做,希望将期望转化为概率形式,发现这样有点困难。再考虑因为所有方案等概率,将求期望转化......
  • P2687 [USACO4.3] 逢低吸纳 题解
    双倍经验分析这是一道求最长下降子序列的题目,且要统计方案,但是会有重复情况,例如以下的的数据,44223我们可以选择\(1,2\),\(1,2\),\(1,4\)这几天来购买,但是\(1,2\)和\(1,3\)本质上是一样的,所以只算一种。根据上面的说明,我们可以得出:当\(dp_j+1=dp_i\)......
  • [题解] P9838 挑战 NPC IV
    P9838挑战NPCIV定义\(f(x)=1+\log_2\operatorname{lowbit}(x)\)。定义一个\(1\simn\)的排列\(p\)的权值是\(\sum_{l=1}^n\sum_{r=l}^n\sum_{i\in[l,r]}f(p_i)。\)求所有\(1\simn\)的排列中权值第\(k\)小的排列的权值,对\(998244353\)取模。......
  • NOIP 冲刺计划
    学习重点图论最短路树:树基础、树直径、LCA、树重心最小生成树拓扑排序差分约束强连通分量双连通分量割点与桥字符串trie树字符串哈希字符串匹配(kmp)动态规划记忆化搜索背包dp线性dp区间dp树形dp数据结构分块ST表线段树数学筛法gcd素数搜索bfsd......
  • [Luogu NOIP 2023 模拟] Solution
    这篇blog在我的博客后台躺了好几天了,只不过今天才记起来发。种树(plant)首先看到因数个数,想到在质因数分解后的序列上考虑问题。进一步观察,每个不同质因子的贡献是独立的。也就是说,我们单独考虑某一个质因子对答案的贡献,是这样的问题:给长度为\(n\)的序列\(a\)和一个数......