2024.7.24 test

A

给定序列 \(A\),满足对于 \(i\) 为奇数的 \(A_i=\frac{i+1}{2}\)\(i\) 为偶数的 \(A_{i}=n+1-\frac{i}{2}\)
多次给出 \(s\),求有多少 \(l,r\in[1,n]\) 满足 \(\sum_{i=l}^rA_i=s\)\(n\le 10^9,s\le 10^{18}\)

简单分讨,判断 \(s\) 是否为 \(n+1\)\(n+2\) 的倍数。

B

定义 \(f(x)=x\otimes 2^{popcount(x)}\)\(T\le 1e5\) 次询问 \([l,r]\) 里面有多少 \(y\) 满足存在 \(x\) 使 \(f(x)=y\)\(l,r<2^{64}\)

考虑枚举 \(y\) 的 popcount,再枚举最高位限制到哪,没有最高位限制后用组合数算。
\(O(T\times 64^2)\)

C

Alice 可以买 \(n\) 种商品花 \(c_i\) 购买第 \(i\) 种商品任意个。Bob 可以买 \(m\) 种其他的商品,每种需要 \(1\) 的代价。
Alice 不能花超过 \(k\) 元。Bob 不能花超过 \(m\) 元。\(n,c_i\le 100,,m,k\le 10^{18}\)
询问 Alice 购买的方案数,使得 A 和 B 把商品标号相同的拿出来作为一堆石子玩 Nim 游戏可以必胜。

重点记录。
先转化为求序列 \(A\) 的个数,满足 \(\sum A_ic_i\le k\),且 \(\otimes A_i> m\)
由于 \(k\) 太大,所以普通的背包因为复杂度带上 \(k\) 所以是不行的。
我们考虑数位 dp。 我们用竖式加法展开 \(\sum A_ic_i\),从低到高填,设已经确定了 \(c\) 的后 \(b\) 位。
那么还需要记录的是当前 \(\sum A_ic_i\) 的后 \(b\) 位与 \(k\)\(b\) 位比较谁大;当前进位有多少,是不超过 \(\sum c\) 的。
\(\otimes A_i\) 更加简单,异或是没有进位的加法,从低到高填记录当前后 \(b\) 位与 \(m\)\(b\) 位比较谁大。
于是状态数是 \(\log k\sum c\)。转移的话是一个背包,把 \(n\) 个物品插入 01 背包。
所以复杂度是 \(O(n\log k\sum c)\)

D

给出序列 \(A\)\(q\) 次查询区间 \([l,r]\),可以操作一次使一个数乘上一个质数。\(n\le 2e5,A_i\le 5e6,q\le 1e6\)
问最少操作次数使得某两数乘起来为平方数。

注意到一个数最多有 \(7\) 个不同的质因子。我们只保留次数为奇数的质因子。
两个数乘起来为平方数,那么因子完全相同。
扫描线,设当前扫到 \(A_i\),枚举其和别的平方数相等的是哪些因子,找出 \(A_j\) 拥有这个因子最大的 \(j\)
注意到答案最多是 \(14\),所以我们找出 \(i\) 结尾的这 \(14\) 个答案极小的子区间,二维数点即可。

posted @ 2024-07-24 20:59  s1monG  阅读(17)  评论(0)    收藏  举报