AT_arc166_b Make Multiples 题解
AT_arc166_b Make Multiples 题解
我的思路与其他题解的思路大体一致,我这里主要是详细的说明更多一些。
简要题意
给定一个整数序列 \(A=(A_1,\ldots,A_N)\) 和正整数 \(a\)、\(b\) 和 \(c\)。
您可以对该序列执行以下操作任意次数,可能为零。
- 选择一个整数 \(i\) \((1\leq i\leq N)\),并将 \(A_i\) 替换为 \(A_i+1\)。
您的目标是使序列 \(A\) 包含「至少一个 \(a\) 的倍数」、「至少一个 \(b\) 的倍数」以及「至少一个 \(c\) 的倍数」。找出实现此目标所需的最少操作数。
- \(1\leq N\leq 2\times 10^5\)
- \(1\leq a, b, c \leq 10^6\)
- \(1\leq A_i\leq 10^{18}\)
状压 DP
我的思路其实比较的朴素,但是也能过。
将任意 \(x\) 变为 \(y\) 的倍数的最小操作次数记为 \(to(x,y)\),简单的,可以这么计算:因为 \(x\) 只能递增,所以 \(x\) 一定是变为 \(\ge x\) 的第一个 \(y\) 的倍数,也就是 \(\lceil\frac{x}{y}\rceil\times y=\lfloor\frac{x+y-1}{y}\rfloor\times y\),于是,最小操作次数 \(to(x,y)=\lfloor\frac{x+y-1}{y}\rfloor\times y-x\)。看着大佬们的「卡常」算法,感觉被碾压了诶。
状态设计与其他大佬类似,设 \(f(i,S)\) 为:使 \(A\) 的前 \(i\) 个数满足条件集合 \(S\) 的最小操作次数。
其中,二进制状压:
- 满足 \(0\) 个条件:
- \(S=0\) 表示不需满足任何条件;
- 满足 \(1\) 个条件:
- \(S=1\) 表示需要满足条件 \(1\)(\(a\) 的倍数);
- \(S=2\) 表示需要满足条件 \(2\)(\(b\) 的倍数);
- \(S=4\) 表示需要满足条件 \(3\)(\(c\) 的倍数);
- 满足 \(2\) 个条件:
- \(S=3\) 表示需要同时满足条件 \(1,2\);
- \(S=5\) 表示需要同时满足条件 \(1,3\);
- \(S=6\) 表示需要同时满足条件 \(2,3\);
- 满足 \(3\) 个条件:
- \(s=7\) 表示需要同时满足条件 \(1,2,3\)。
易知:
-
初始化:
\(f(0,0)=0\),\(\forall i\neq0,f(0,i)=\inf\).
-
满足 \(0\) 个条件:
\(f(i,0)=f(i-1,0)\);
-
满足 \(1\) 个条件:
\(f(i,1)=\min\{f(i-1,1),f(i-1,0)+to(A_i,a)\}\).
\(f(i,2)=\min\{f(i-1,2),f(i-1,0)+to(A_i,b)\}\).
\(f(i,4)=\min\{f(i-1,4),f(i-1,0)+to(A_i,c)\}\). -
满足 \(2\) 个条件:
\(f(i,3)=\min\left\{\begin{array}{l}f(i-1,3),\\f(i-1,1)+to(A_i,b),\\f(i-1,2)+to(A_i,a),\\f(i-1,0)+to(A_i,\operatorname{lcm}(a,b))\end{array}\right\}\).
\(f(i,5)=\min\left\{\begin{array}{l}f(i-1,5),\\f(i-1,1)+to(A_i,c),\\f(i-1,4)+to(A_i,a),\\f(i-1,0)+to(A_i,\operatorname{lcm}(a,c))\end{array}\right\}\).
\(f(i,6)=\min\left\{\begin{array}{l}f(i-1,6),\\f(i-1,2)+to(A_i,c),\\f(i-1,4)+to(A_i,b),\\f(i-1,0)+to(A_i,\operatorname{lcm}(b,c))\end{array}\right\}\).
-
满足 \(3\) 个条件:
\(f(i,7)=\min\left\{\begin{array}{l}f(i-1,7),\\f(i-1,3)+to(A_i,c),\\f(i-1,5)+to(A_i,b),\\f(i-1,6)+to(A_i,a),\\f(i-1,1)+to(A_i,\operatorname{lcm}(b,c)),\\f(i-1,2)+to(A_i,\operatorname{lcm}(a,c)),\\f(i-1,4)+to(A_i,\operatorname{lcm}(a,b)),\\f(i-1,0)+to(A_i,\operatorname{lcm}(a,b,c))\end{array}\right\}\).
-
于是,答案为 \(f(n,7)\)。
代码
见:https://atcoder.jp/contests/arc166/submissions/46876171
特别要注意的,别抄错数、、、
本文来自博客园,作者:RainPPR,转载请注明原文链接:https://www.cnblogs.com/RainPPR/p/solution-at-arc166-b.html
如有侵权请联系我(或 2125773894@qq.com)删除。