首页 > 其他分享 >ARC166 B Make Multiples 题解

ARC166 B Make Multiples 题解

时间:2023-12-11 17:25:42浏览次数:30  
标签:ch int 题解 Make read 加成 倍数 lcm Multiples

Link

ARC166 B Make Multiples

Question

给出 \(N\) 个整数, \(A_1...A_N\) ,还有三个数 \(a,b,c\)

我们可以给 \(A_i\) 加上 \(1\)

需要使得数组 \(A\) 满足,存在一个数是 \(a\) 的倍数,一个数是 \(b\) 的倍数,一个数是 \(c\) 的倍数

求最少的操作次数

Solution

考虑对于每个数的操作无非就这几种

  • 不变
  • 加成 \(a\) 的倍数
  • 加成 \(b\) 的倍数
  • 加成 \(c\) 的倍数
  • 加成 \(lcm(a,b)\) 的倍数
  • 加成 \(lcm(a,c)\) 的倍数
  • 加成 \(lcm(b,c)\) 的倍数
  • 加成 \(lcm(a,b,c)\) 的倍数

我们不知道每个数具体的操作,但发现操作数很少,就考虑状态压缩

用 \(a\) 表示二进制的第一位 ,用 \(b\) 表示二进制的第二位,用 \(c\) 表示二进制的第三位

我们可以用二进制表示状态和操作

那么上面的8种操作就可以用 1-7 来表示

定义 \(F[i][s]\) 表示前 \(i\) 个整数,此时的状态是 \(s\) 的最小的加的次数

转移方程:

\[F[i][s|s'] = min(F[i][s] + w[s']) \]

答案 \(F[N][7]\)

Code

#include<bits/stdc++.h>
#define int __int128
using namespace std;
const int maxn= 200005;
inline int read(){
    int ret = 0, f = 1;char ch = getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f = -f;ch=getchar();}
    while(ch>='0'&&ch<='9')ret=ret*10+ch-48,ch=getchar();
    return ret;
}
inline void print(int x, int flag = 1)
{
    if (x < 0) putchar('-'), x = ~(x - 1);
    if (x > 9) print(x / 10, 0);
    putchar(x % 10 + 48);
    if (flag) putchar(flag & 1 ? ' ' : '\n');
}
inline int gcd(int x,int y) {return y?gcd(y,x%y):x;}
inline int lcm(int x,int y) {return x/gcd(x,y) *y;}
int N,x,y,z,F[maxn][8],tmp[8],w[8];
signed main(){
    freopen("B.in","r",stdin);
    freopen("B.out","w",stdout);
    N=read();x=read();y=read();z=read();
    w[1]=x;w[2]=y;w[4]=z;w[3]=lcm(x,y);w[5]=lcm(x,z);w[6]=lcm(y,z);w[7]=lcm(x,lcm(y,z));
    memset(F,0x7f,sizeof F);F[0][0]=0;
    for(int i=1;i<=N;i++){
        int now=read();
        for(int j=1;j<8;j++)
            tmp[j]=(w[j]-(now%w[j]))%w[j];
        F[i][0]=0;
        for(int j=0;j<8;j++){
            F[i][j]=min(F[i][j],F[i-1][j]);
            for(int k=1;k<8;k++)
                F[i][j|k]=min(F[i][j|k],F[i-1][j]+tmp[k]);
        }
    }
    print(F[N][7]);
    return 0;
}

Summary

标签:ch,int,题解,Make,read,加成,倍数,lcm,Multiples
From: https://www.cnblogs.com/martian148/p/17894903.html

相关文章

  • CF1901 D Yet Another Monster Fight 题解
    LinkCF1901DYetAnotherMonsterFightQuestion现在给你一堆怪物,你拥有法术(一个法术可以连续攻击这n个所有怪物),你可以选择任意一个怪物作为法术的第一个攻击目标(伤害为\(x\)),然后除了第一个攻击目标可以任意,其他攻击目标只能为曾经攻击目标的相邻怪物。然后伤害依次递减,\(x......
  • CF1764H Doremy's Paint 2 题解
    题目链接先断环成链,由于对于多组询问不好一起处理,我们先考虑单组询问的处理方式。一个很暴力的想法是每次模拟题目要求的操作并且最后数颜色,我们这是在通过下标进行操作最后再数颜色,而很多对于下标的操作都是不必要的,考虑直接枚举颜色进行判定。对于每种颜色,它对于最后答案有贡......
  • UVA1658 Admiral 题解
    LinkUVA1658AdmiralQuestion给出一个图,找出\(1\simn\)的两条,使得路径和最小Solution可以把点拆开,把除了\(1\)和\(n\)的点\(i\),拆成\(i\)和\(i'\),\(i\)到\(i'\)连一条费用为\(0\),容量为\(1\)的边,如果原来有一条边\(u-v\),那么就建立一条\(u'->v\),费......
  • P2341 受欢迎的牛 G 题解
    LinkP2341[USACO03FALL/HAOI2006]受欢迎的牛GQuestion牛栏中有\(N\)头奶牛,和一些\(M\)对爱慕关系,A->B表示A爱慕B。每个奶牛都喜欢自己,被所有奶牛喜欢就是一头明星奶牛,求明星奶牛的数量Solution考虑一个强连通分量里面的奶牛是相互爱慕的,先根据强连通分量缩点,缩......
  • 题解 QOJ1173【Knowledge Is...】 / accoders::NOI 5681【interval】
    https://qoj.ac/contest/537/problem/1173problem给定\(n\leq10^6\)个区间,你需要求出能够最多选出多少对区间,使得两个区间不交(区间为闭区间)。要求一个区间最多属于一对选出的区间。solution这是一般图匹配问题的特殊情况,所以放弃dp,考虑贪心、网络流、匹配等。按照左端点......
  • qt和cmake安装
    1/qtIndexof/archive/qt  2、cmakeDownloadCMake 安装比较简单 记得选择addpath,这样就不用手动添加环境变量了 3、vscode插件c/c++ cmake cmaketools qtconfigure qttools ......
  • P5048 [Ynoi2019 模拟赛] 题解
    题意给定\(n\)个数,有\(m\)个询问,每个询问给定\(l\)和\(r\),求出区间\(l\)到\(r\)中的最小众数出现次数,强制在线。数据范围:\(n\le500000\),空间限制:\(62.5MB\)。思路这道题的弱化版是蒲公英,这道题加强的地方在于数据范围。正常的分块求区间众数的空间复杂度是\(O(n......
  • CF1842E Tenzing and Triangle 题解
    题意不多赘述。思路如果两个所选的三角形有重合部分的话,那么这种情况肯定是不会出现的。因为如果把这两个三角形合成一个大三角形的话,不仅覆盖面积会增大,而且花费的代价还不会多。于是我们可以想到用dp来解决,设\(dp_{i}\)表示删完横坐标为\(0\)到\(i\)中的点的最小代价......
  • [ABC304Ex] Constrained Topological Sort 题解
    题意给定一张有向图\(G\),有\(n\)个点和\(m\)条边,问是否存在一种拓扑序的排列\(P\)使得\(l_{i}\lep_{i}\ler_{i}\)。思路首先对于一条边\(u\tov\),如果限制满足\(r_{v}\ler_{u}\)或者\(l_{v}\gel_{u}\)的话,那么这个限制其实是不完全正确的。因为最终的序列......
  • 【题解】AtCoder abc322_f Random Update Query
    传送门:https://atcoder.jp/contests/abc332/tasks/abc332_f容易发现,对于一个位置$i$,$A_i$的最终值是由对$i$的最后一次赋值操作决定的;因此,将所有操作按时间顺序倒过来考虑,则由第$j$次操作决定$A_i$最终值的概率为"在第$(j+1)$~$m$次操作中没有修改过$i$的概率"与"第......