Page Top

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

特别要注意的,别抄错数、、、

posted @ 2023-10-23 17:41  RainPPR  阅读(13)  评论(0编辑  收藏  举报