// // // // // // // // // // // // // //

线性基练习题

线性基练习题

前言

一个题单没做完的我有开了另一个

刚学嘛 刷了一部分的题 整理一下

照着这个默认排序的题单刷的(然后不会的就跳了)


题目

1. P3812 【模板】线性基

模板题

没什么好说的


代码


2. P3265 装备购买

这个也算是模板题???

这模板题做的真是心累

这啥啊? 整数线性基? 高斯消元?

于是跑去学了一下高斯消元(然后现在还是不会写


如果一件物品 \(i\) 可以用前面的物品凑出来 有

\[\sum_{j = 1}^{i - 1} k_j \times a_{j, 1} = a_{i, 1}\\ \sum_{j = 1}^{i - 1} k_j \times a_{j, 2} = a_{i, 2}\\ ... \\ \sum_{j = 1}^{i - 1} k_j \times a_{j, m} = a_{i, m}\]

这玩意儿需要通过高斯消元来解 也可以结合线性基来求

至于价值 可以直接贪


代码


3. P4301 新Nim游戏

做的时候推了半天结论推出来了 但是没推出到底怎么着不合法...

推潮了去看题解

哦 原来一定合法...


考虑原来的游戏 当所有的石子堆数量异或起来不为 \(0\) 的时候为先手必胜

所以我们只需要通过第一轮的操作使对方无论如何操作都无法使得剩余的石子堆中石子数量异或起来为 \(0\) 就行了

考虑对石子数量构造线性基 由于线性基中的数异或起来都是不为 \(0\) 的 所以我们只需要将线性基以外的数都取走就可以了

使得取的石子最少 直接贪就好了


代码


4. P4570 元素

题目翻译成人话大概就是找序列的线性基 求最大价值

线性基中元素的数量是唯一的 直接贪就好了


代码


5. P5556 圣剑护符

两子集属性值相同 相当于 若干个数异或起来是否能得到另一个数

构造线性基 如果这些数不能全部插进去 那么就是存在的

而根据数据范围 最多只能插入 \(31\) 个数 如果点数多于 \(31\) 那么必然存在 否则直接对于这些点暴力构造线性基即可

链的维护直接上树剖就可以


代码


6. P4151 最大XOR和路径

同一条边经过两次相当于没走 那么我们就可以通过一条边到达一个环 尝试累加环上的贡献之后 再通过这条边出来

也就是说所有的环的异或和都是可以直接用的 而不需要关系到这个环的边上的权值

问题相当于找一条链 使用给定的若干数进行异或 求最大值

异或最大值显然是可以直接构造线性基来搞的

那么这条链怎么找

两种情况

要么两点之间只有一条链 那么就不用选了 直接拿来用就好了

或者两点之间有多条链 那么对于其中的任意一条链 其必然存在于一个环中 那么当这条链异或上其所在的那个环 得到的就是这个环上的另一部分 也就是另一条链

所以这条链完全可以任意选 取异或最大值即可


代码


7. CF845G Shortest Path Problem?

双倍经验 就是把最大换成最小


代码


8. P3292 幸运数字

倍增 点分治 什么的感觉都好麻烦... 而且没写过

所以果断树剖 然后带着四个 \(\log\) 吸氧硬卡过去


线性基可以合并 直接将一个往另一个里面插就好了

树剖 + 线段树 + 线性基


写完跑一下样例 诶 过了

  1. 直接扔上去 然后只有六十分 \(T\) 了四个点

  2. 吸上一口氧气 变成了九十分 最后一个点超时了 \(0.05\)

  3. 去掉 \(define\ int\ long\ long\) 改成自己开 然后还是九十分

  4. 能加 \(inline\) 的都加上 仍旧是九十分 最后一个点超时

  5. 能加 $register $ 的都加上 仍旧是九十分 最后一个点超时

  6. 看了一下 点数只有两万 把这一类的数组改成 \(short\) 吸氧碾了过去


代码


9. CF895C Square Subsets

又是一道很仙的题

状压 \(dp\) 的做法不会 所以还是线性基吧

困死了 先不写了...

刚刚一不小心又睡着了.../kk


第二天跑过来继续补

做的时候根本看不出这东西和线性基有毛线的关系...


一个完全平方数分解质因数后每个质因子出现的次数都为偶数次

所以只有乘积的质因子出现次数的奇偶性是有贡献的

小于等于 \(70\) 的质因数就只有十九个 可以压一下 那么两个数相乘就相当于表示因子的两个二进制数异或 而能够异或出 \(0\) 则其所有的质因数出现偶数次 也就是可以得到完全平方数

显然对于所有不能插入线性基的数一定是能异或出 \(0\) 的 若设线性基中有 \(cnt\) 个数 对于所有的其他数 其子集一定可以被线性基中的数异或出来

也就是除了线性基中的数 外面的数可以随便取

\(ans = 2^{n - cnt} - 1\)


代码


posted @ 2021-08-06 22:58  Blank_space  阅读(70)  评论(8编辑  收藏  举报
// // // // // // //