Codeforces 1389 题解(A-E)

AC代码

A. LCM Problem

\(a < b\),则\(LCM(a,b)\)\(a\)的整数倍且\(LCM(a,b) \ne a\),所以\(LCM(a,b) \ge 2a\),当且仅当\(b=2a\)时取等号。

根据这个性质,就可以让\(a=l, b = 2l\),如果符合条件就输出,否则无解。

B. Array Walk

这题暴力+贪心做。

根据贪心,答案必定取在在同一个位置左右横跳的情况下。

由于\(z\)的取值很小,所以直接枚举走到第\(i\)个位置之后左右横跳\(c\)次的收益,然后再加上走完剩余步数的收益,取最大值为答案。

注意,剩余步数为\(1\)\(c<z\)时要考虑向左走的情况。

C. Good String

易得,字符串符合条件\(\Leftrightarrow\)字符串有长度为2的循环节。

然后就暴力枚举循环节,每次遍历一遍字符串计算代价,代价的最小值就是答案。

注意,仅当循环节的两个字符都一样时才可以不完全循环。

D. Segment Intersections

首先,如果\([l1,r1]\)\([l2,r2]\)相交,那么就可以不耗费步数增加\(I\)

然后,若两个线段不相交,则耗费一定的步数之后,可以到达两个线段相交的状态。

在两个线段相交但不完全相等的情况下,耗费1步可以使\(I\)增加1,直到两个线段完全相等。

最后,在两个线段完全相等之后,就只能耗费2步使\(I\)增加1。

然后,就是快乐的模拟过程了,优先使用耗费步数低的操作,直到\(I \ge k\)

UPD: D题代码被叉了,有个地方可能会出现除零错误,现在已经更新成能过的版本了。

E. Calendar Ambiguity

\(y\)\(x\)号为第\(yd+x\)天,对应星期\((yd+x) \text{ } mod \text{ } w\)

题目转换成寻找满足\(yd+x = xd+y \text{ } (mod \text{ } w)\)\((x, y)\)

移项并化简后得到\((x - y)(d - 1) = 0 \text{ } (mod \text{ } w)\)

由于\((d-1)\)是常数并且可能包含\(w\)的某些因子,所以可以将用\(w^{\prime}= \frac{w}{gcd(d-1,w)}\)来替代\(w\),从而消除上述公共因子的影响。

现在的式子为\((x - y)(d - 1) = 0 \text{ } (mod \text{ } w^{\prime})\),其中\((d-1)和w^{\prime}\)没有公共因子。由此,只需要找到满足\((x - y) = 0 \text{ } (mod \text { } w^{\prime})\)\((x, y)\),即\((x-y)\)应为\(w^{\prime}\)的正整数倍。

根据题意,\(x < y\)\(x,y\)都是符合要求的月份和日期,所以\((x-y) \in [1, min(m,d)]\)。所以,可以枚举\((x-y)\)的值,计算每个对应值对答案的贡献并累加,从而得到最终的答案。

又因为\((x-y)\)应为\(w^{\prime}\)的正整数倍,所以枚举\(i \times w^{\prime}\)即可。

易得,对于固定的\(k=x-y\)\(k\)对答案的贡献为\(min(m,d)-k\)。所以,最终答案为

\[ans = \sum^{\frac{min(m, d)}{w^{\prime}}}_{i = 1} min(m,d) - i \times w^{\prime} \]

很明显,这个式子等差,可以用高斯求和公式在\(O(1)\)的时间内计算。

计算过程可能会炸精度,偷懒用了py写。

posted @ 2020-07-30 00:40  _Backl1ght  阅读(325)  评论(0编辑  收藏  举报