Codeforces Round 1034 (Div. 3) 部分题解
D. Binary String Battle
这种题为什么想了半小时
先特判先手一次结束的情况。
考虑在游戏最后会到一个包含一段连续 \(k+1\) 个 \(1\) 其余位置都是 \(0\) 的情况,我们讨论这个情况下的胜负。
\(0\) 的个数为 \(n-(k+1)\) 个,Alice 一次操作后会剩下一个 \(1\) ,此时若左边或右边存在连续 \(k\) 个 \(1\) ,Bob 就能恢复原局面,用式子来说,有 \(x+y=n-k-1,a+b=k\) ,Bob 能恢复局面当且仅当 \(x+a\geq k\) 或 \(y+b \geq k\) ,若对于所有 \(x,y,a,b\) 成立,Alice 必输。
化简式子得到 \(n-k-1<x+a<k\), 则 Alice 胜利需要有 \(k-(n-k-1)>1\) , 即 \(n<2k\) 。
F. Minimize Fixed Points
首先 \(a_1=1\) 。
考虑固定点的下界,所有满足 \(2p>n\) 的质数都必须成为固定点,现在构造方案使得达到下界。
质数的限制是比较大的,先考虑所有质数 \(p\) 和 \(2p\) 构成一个环,可以使质数不成为固定点,现在考虑其他点,只需要加入最小因子所在的环就行,每个质数代表的环做一个轮换就行,用埃氏筛筛一下即可。
G. Modular Sorting
根据裴署定理,对于 \(k,a,m\) ,在模 \(m\) 意义下可以得到所有的 \(a+x\cdot \gcd(k,m)\) 的值,考虑对于一个 \(d=\gcd(k,m)\) ,怎么判断可行。
先将所有的 \(a_i\) 变成能凑到的最小值,即 \(a_i \bmod d\) ,此时考虑若 \(a_i>a_{i+1}\) 则 \(a_{i+1}\cdots a_n\) 的后缀需要统一加 \(d\) ,算出有多少个位置需要对后缀加 \(d\) ,最后结果下 \(a_n\) 一定是最大的元素,并且序列非降,此时这个序列合法的条件就是 \(a_n<m\) 。也就是说,假定需要加 \(x\) 次 \(d\) ,模 \(d\) 后的序列为 \(a\) ,合法条件是 \(a_n+x\cdot d<m\) 。
对于一次单点修改,对于一个 \(d\) 只会更改最多 \(2\) 个位置是否需要加 \(d\) ,而 \(\gcd(k,m)\) 只可能是 \(m\) 的约数,所以单次修改是 \(O(\tau(m))\) 的,查询是 \(O(1)\) 的,总复杂度 \(O((n+Q)\tau(m))\) ,\(\tau(m)\) 是小于 \(\sqrt{m}\) 的,\(1-5\times 10^5\) 中最大约数个数为 \(200\) 。
写的时候筛约数写错了:
for(int i=1;1ll*i*i<=m;i++) {
f.push_back(i);
if(m/i!=i) f.push_back(m/i);
}
警钟长鸣。

浙公网安备 33010602011771号