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);
}

警钟长鸣。

posted @ 2025-07-02 11:54  蒻蒻虫  阅读(267)  评论(0)    收藏  举报