Codeforces Round 885 (Div. 2) 题解

发布时间 2023-08-01 21:11:40作者: cantorsort2919

A. Vika and Her Friends

看一下样例就可以发现,Vika 以及她的朋友都不能走对角线,在这种情况下 Vika 和朋友的距离为 偶数,且朋友一定追不上 Vika

所以直接判断 Vika 和朋友的距离是否都为偶数即可

B. Vika and the Bridge

显然贪心,枚举颜色,找到相邻距离最大的两块木板,记该距离为 \(dist1\),第二大距离为 \(dist2\)

答案就是 \(max\{\frac{dist1}{2},dist2\}\)

C. Vika and Price Tags

不难看出答案最短一定是以 \(3\) 为循环节的循环,所以我们只需要找到每个位置是在哪些时间点会变为 \(0\) 即可

不难看出如果 \(x\ge 2y\),则有三次操作后:\((x,y)\to(y,x-y)\to(x-y,x-2y)\to(x-2y,y)\)

所以可以令 \(x\)\(2y\) 取余,不影响答案,如此可以快速令 \(x=0\)

D. Vika and Bonuses

首先显然,最优情况一定是 先连续自增(也可以不增)再一直累积

\(n\equiv 5\pmod{10}\)\(n\equiv 0\pmod{10}\) 时,分类讨论

剩下的情况,稍微算算,个位数将会进入 \(2\to 4\to 8\to 6\to 2\to 4\to 8\to\cdots\) 的循环

为了方便,当 \(k\le 20\) 的时候我们直接暴力,剩下的暴力跳 \(n\),使其达到 \(n\equiv 2\pmod{10}\) 的一般情况

每次循环后,\(n\) 会增加 \(20\) 这一定值,分类讨论,设循环了整 \(i\) 次,则有:

\[ans=(n+20i)(k−4i) \]

展开

\[ans=−80i^2+(20k−4n)i+nk \]

上式是一个关于 \(i\) 的开口向下的抛物线解析式,直接取其对称轴 \(i=\frac{5k-n}{40}\)

这样我们就算出了所有 \(n\equiv 2\pmod{10}\) 的最大值,再让 \(n\) 自增一次算 \(n\equiv 4\pmod{10}\) 的情况,然后是 \(n=8,n=6\),这样就结束了

E. Vika and Stone Skipping

假设答案为 \(\sum_{i=x}^y i\),等差数列求和的形式为 \(\frac{(x+y)(x-y+1)}{2}\)

不妨令我们需要的值为 \(t\),则有 \((x+y)(x-y+1)=2t\),我们要求这个方程的解

显然我们可以看出 \(x+y\)\(x-y+1\) 的奇偶性不同方程才可能有解,所以我们必须把 \(2t\) 分解成一个奇数和一个偶数的乘积

如果将 \(2t\) 分解质因数,那么所有质因子 \(2\) 一定在一边,而剩下的质因子可以任意分配,所以答案就是 \(\prod_{p\not=2(cnt_p+1)}\)

要特判模意义下除以 \(0\) 的运算

F. Vika and Wiki

考虑倍增,我们需要快速计算序列操作 \(2^k\ (k\in \mathbb N^*)\) 次后的结果

手玩一下可以发现当操作 \(2^k-1\) 次时,所有 \(a_i\) 会变为 \(\oplus_{j=0}^{2^k}a_{(i+j)\bmod n}\),利用这个性质我们可以先操作 \(2^k-1\) 次,再操作一次,这样就达到了操作 \(2^k\) 次的效果,每次操作的复杂度都是 \(O(n)\),总复杂度为 \(O(n\log n)\)