首页 > 其他分享 >[ARC122E] Increasing LCMs 题解

[ARC122E] Increasing LCMs 题解

时间:2024-09-25 11:51:55浏览次数:7  
标签:ARC122E Increasing gcd int 题解 构造 110 lcm operatorname

感觉像比较套路的构造题。

思路

假如我们正着进行构造,可以发现我们加入一个数以后,对后面的数产生的影响是很大的。

但是如果我们从最后一个数开始构造,那么可以发现它是不会对之后的构造产生任何影响的。

应为越前面的数的限制会越少,那么可以填的数一定是不减的。

一个数可以填在后面,那么也一定可以填在前面。

所以我们现在只需要不断找到可以填的数即可。

考虑限制是什么。

要求:

\[a_i\not |\operatorname{lcm}_{i=1}^{j-1}a_j \]

但是 \(\operatorname{lcm}\) 太大了,我们需要简化一下,相当于:

\[\gcd(a_i,\operatorname{lcm}_{i=1}^{j-1}a_j)<a_i \]

\[\operatorname{lcm}_{i=1}^{j-1}\gcd(a_i,a_j)<a_i \]

这样就可以处理了。

时间复杂度:\(O(n^3\log n)\)。

Code

#include <bits/stdc++.h>
using namespace std;

#define int long long

int n, a[110], b[110], v[110];

inline int lcm(int x, int y) {
  int g = __gcd(x, y);
  return (__int128) x * y / g;
}

signed main() {
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> a[i];
  for (int i = n; i >= 1; i--) {
    for (int j = 1; j <= n; j++) {
      if (v[j]) continue;
      int x = 0;
      for (int k = 1; k <= n; k++) {
        if (v[k] || k == j) continue;
        if (x == 0) x = __gcd(a[j], a[k]);
        x = lcm(__gcd(a[j], a[k]), x);
      }
      if (x < a[j]) {
        v[j] = 1, b[i] = a[j];
        break;
      }
    }
    if (b[i] == 0) cout << "No\n", exit(0);
  }
  cout << "Yes\n";
  for (int i = 1; i <= n; i++) cout << b[i] << " \n"[i == n];
}

标签:ARC122E,Increasing,gcd,int,题解,构造,110,lcm,operatorname
From: https://www.cnblogs.com/JiaY19/p/18431020

相关文章

  • 算法题之图论 [NOIP2001 提高组] Car的旅行路线详细题解
    P1027[NOIP2001提高组]Car的旅行路线这道题的思路呢,就是建个图,然后跑一遍Floyd,比较最小值就可以解决了。but!它每个城市只给三个点(共四个),所以还得计算出第四个点坐标。这里根据矩形的中点公式来表示未知点的坐标:(这个思路源于大佬 _jimmywang_       ......
  • [ARC121E] Directed Tree 题解
    简单容斥题。思路题面的条件相当于一个位置上填的点不能是自己的祖先。发现直接做并不好做。考虑容斥。我们想要求出\(f_i\)为至少有\(i\)个不合法位置的方案数。那么答案为:\[\sum_{i=0}^nf_i(-1)^i\]如何求解。设\(f_{i,j}\)为\(i\)子树下有\(j\)个不合法位......
  • 2024-2025专题一题单 - 题解
    A-Virus原题链接题解B-Coverage原题链接题解C-Sensors原题链接题解D-MakeTakahashiHappy原题链接题解E-Don’tbecycle原题链接题解F-AlmostEqual原题链接题解G-StepUpRobot原题链接题解H-SnukeMaze原题链接题解I-MEX原题链接......
  • P5329 [SNOI2019] 字符串 题解
    Description给出一个长度为\(n\)的由小写字母组成的字符串\(a\),设其中第\(i\)个字符为\(a_i\(1\leqi\leqn)\)。设删掉第\(i\)个字符之后得到的字符串为\(s_i\),请按照字典序对\(s_1,s_2,……,s_n\)从小到大排序。若两个字符串相等,则认为编号小的字符串字典序更小。......
  • CF164D Minimum Diameter 题解
    最小点覆盖模板题。思路考虑二分直径\(x\)。我们将距离\(>x\)的点对连一条边,那么每一条边的两端至少有一端需要被删掉。这是最小点覆盖的定义。那么就是判断最小点覆盖是否小于等于\(k\)。发现这个问题并不好用一些多项式复杂度的做法解决。考虑暴搜。每一次我们把度......
  • CF2003F Turtle and Three Sequences 题解
    个人觉得*2800有点虚高。如果做过类似的题(比如[THUSCH2017]巧克力),应该可以想到随机映射,状压dp也不难想。实际上,看到要选出\(m\)种不同的颜色,且\(m\le5\)就可以想到将每种颜色随机映射到\(1\)到\(m\)中,这样子得出来的答案不会更优,而当答案选择的\(m\)种颜色恰好......
  • 20240924 模拟赛 T4 题解
    Description这是一道交互题。有一棵\(n\)个节点的树,现在要求你通过若干次询问得到这棵树的每一条边连接哪两个点。每次询问你需要指定\(n\)个整数\(d_1,d_2,\ldots,d_n\),满足\(-1\leqd_i\leqn\),其中\(1\leqi\leqn\)。每次询问交互库会返回给你一个长度为\(n\)的......
  • P4780 Phi的反函数 题解
    因为\(\varphi(x)\)的值只与\(x\)的不同质因子有关,又因为\(2^{31}\)之内的数的质因子个数不超过\(10\),所以容易枚举\(10\)个位置上填入的质因子打出朴素的暴力,简单剪枝后得到\(20\)分。注意需要先判掉\(x=n+1\)的情况。考虑优化:因为\(\varphi\)的值只与质因......
  • Codeforces Round 959 (Div. 1 + Div. 2) C. Hungry Games题解
    CodeforcesRound959(Div.1+Div.2)C.HungryGames题解题目链接大致题意:给定一个长度为n的数组,并且给出一对l,r表示一个区间,如果∑i......
  • 力扣题解2207
    大家好,欢迎来到无限大的频道。今日继续给大家带来力扣题解。题目描述(中等)​:字符串中最多数目的子序列给你一个下标从 0 开始的字符串 text 和另一个下标从 0 开始且长度为 2 的字符串 pattern ,两者都只包含小写英文字母。你可以在 text 中任意位置插入 一个......