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

[ARC122E] Increasing LCMs 题解

时间:2024-02-18 16:23:12浏览次数:38  
标签:std ARC122E lcm int 题解 kMaxN leq Increasing fl

Description

给定长度为 \(N\) 的正整数序列 \(\{A_i\}\),满足 \(A_i\) 单调升。

问是否能将 \(\{A_i\}\) 重排为序列 \(\{x_i\}\),满足:

令 \(y_i = \operatorname{LCM}(x_1, \dots, x_i)\),\(\forall 1\le i<N, y_i<y_{i+1}\)(即 \(y_i\) 单调升)。

$ 1\ \leq\ N\ \leq\ 100,2\ \leq\ A_1\ <\ A_2\ \cdots\ <\ A_N\ \leq\ 10^{18} $

Solution

直接构造显然很难,但是注意到一件事情,就是如果一个序列 \(B_1,\dots,B_N\) 合法,那么如果把 \(B_i\) 放到最后能使得 \(y_{N-1}<y_{N}\),则整个序列依然合法。

所以每次从后往前确定数,找到能够满足 \(y_{N-1}<y_N\) 的 \(A_i\) 放到最后面,只要每次都能找到就一定合法。

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

Code

#include <bits/stdc++.h>

#define int int64_t

const int kMaxN = 105;

int n;
int a[kMaxN], res[kMaxN];

void dickdreamer() {
  std::cin >> n;
  for (int i = 1; i <= n; ++i) std::cin >> a[i];
  for (int i = n; i; --i) {
    for (int j = i; j; --j) {
      std::swap(a[i], a[j]);
      int lcm = 1;
      bool fl = 1;
      for (int k = 1; k < i; ++k) {
        int val = std::__gcd(a[k], a[i]);
        lcm = lcm / std::__gcd(lcm, val) * val;
        if (lcm % a[i] == 0) {
          fl = 0;
          break;
        }
      }
      if (fl) break;
      else if (j == 1) return void(std::cout << "No\n");
      std::swap(a[i], a[j]);
    }
  }
  std::cout << "Yes\n";
  for (int i = 1; i <= n; ++i) std::cout << a[i] << ' ';
}

int32_t main() {
#ifdef ORZXKR
  freopen("in.txt", "r", stdin);
  freopen("out.txt", "w", stdout);
#endif
  std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);
  int T = 1;
  // std::cin >> T;
  while (T--) dickdreamer();
  // std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";
  return 0;
}

标签:std,ARC122E,lcm,int,题解,kMaxN,leq,Increasing,fl
From: https://www.cnblogs.com/Scarab/p/18019488

相关文章

  • ABC341E 题解
    看到01串的反转考虑维护异或差分序列\(s_i=a_i\oplusa_{i-1}\)。这样区间反转就变成了单点修改。然后考虑怎么查询:若一个区间\([l,r]\)是好区间,那么对于\(i\in[l+1,r]\)一定存在\(s_i=1\)。所以我们可以查询区间和来判断是否为好区间。使用线段树维护区间和即可,单......
  • 11.【题解】最短母串
    最短母串hzoi题解题意给你几个字符串,给你密码长度,之后求出密码有多少种可能,其中如果方案数\(\leq42\),则需要按字典序输出所有方案。题解首先先求出每两个字符串的最大重合,记为\(\largerel{_i}{_,}{_j}\)(\(relation\),在枚举时使用。(其实应该用\(dfs\)),但蒟蒻太蒻......
  • HH的项链——题解
    题目描述直接求解会导致不同贝壳在上个区间算过但这个区间没标记的情况,所以在求解时要把上个区间的标记转移到这个区间转移前先右边界由小到大排序,然后转移上个右边界到这个右边界的标记,同时记录上个标记出现的地方,方便转移下面附代码solution#include<bits/stdc++.h>using......
  • 区间最大子区间和——山海经题解
    区间最大子区间和规定:ls:区间靠左部分子区间最大和rs:区间靠右部分子区间最大和ms:区间子区间最大和s:区间和方程与数量关系如图所示,可以用动态规划解决山海经题解这题是上述方法在线段树中的应用solution#include<bits/stdc++.h>usingnamespacestd;constintmax......
  • 寒假训练——vj题解
    B-BM算日期M是一位数学高手,今天他迎来了Kita的挑战。Kita想让BM算出这几年内有多少个闰年。BM觉得这问题实在太简单了,于是Kita加大了难度。他先给出第一个年份,再给出一个整数。Kita要BM进行加法运算后得到第二个年份,然后算出这两个年份之间有多少个闰年。然......
  • ABC341G 题解
    blog。妈的,被trick干爆了。\(\textbf{Trick}\):将所有\(N_i=(i,\sum\limits_{j=1}^ia_j)\)视作一点,则区间\([l,r]\)的平均值为\((N_{l-1},N_r)\)的斜率。\(\textbf{Prove}\):由\(\text{slope}=\dfrac{y_2-y_1}{x_2-x_1}\)易证。根据这个trick,\(k\)的答案即为\(k......
  • luogu2119题解
    本题考察对于枚举的方式对程序的性能的提升。有一个小的优化,\(n\)的范围比\(m\)的范围小,由于我们不关心顺序,我们既可以在值域上枚举也可以在物品上枚举,这里为了优化在值域上枚举更好。最简单的枚举是直接枚举\(a,b,c,d\)或是枚举其中三个数枚举另一个,时间复杂度为\(O(n^4)......
  • P10171题解
    P10171[DTCPC2024]取模题目传送门题解不会多项式导致的,赛后秒过。一个显然的结论:如果原序列有相等的数答案为\(0\),其次大于\(4\times10^5\)的\(k\)均符合要求。问题在于小于\(4\times10^5\)的答案。赛时想了很多奇妙的算法,诸如根号分治、线段树维护余数等等。其......
  • CF1472C Long Jumps题解
    【题目分析】本题有两个方法,方法一:每一个位置可得的分分别求出,打擂找出最大(可得部分分)方法二:从后往前求可得的分数,以避免一些不必要的重复。【设计程序】方法一:#include<bits/stdc++.h>#include<iostream>#include<stdio.h>#include<cstdio>#include<queue>usingnames......
  • CF1196B Odd Sum Segments题解
    【问题分析】本题考了奇数。由此想到以下定律:奇数+偶数=奇数;奇数+奇数=偶数;偶数+偶数=偶数;所以偶数可以忽略不计,只有奇数可以对结果产生影响,所以我们只要注意奇数即可。经过思考可得奇数的个数至少为$k$个且比$k$多的个数为偶数,此时多出的奇数可组成偶数,对结果不产生......