首页 > 其他分享 >「解题报告」ARC122E Increasing LCMs

「解题报告」ARC122E Increasing LCMs

时间:2023-03-30 22:14:28浏览次数:39  
标签:__ ARC122E Increasing gcd int LCMs int128 lcm mathrm

紫题不会了,感觉要退役了

前缀 \(\mathrm{lcm}\) 的限制很强,考虑每次消去一个数。

发现最后一个数没有依赖,考虑最后一个数的条件,其实就是最后一个数不是前 \(n-1\) 个数的 \(\mathrm{lcm}\) 的倍数,即 \(\displaystyle \gcd(\mathop{\mathrm{lcm}}_ {i\ne j}(a_j),a_i) < a_i\)。这个条件可以改写为 \(\displaystyle \mathop{\mathrm{lcm}}_ {i\ne j}(\gcd(a_i, a_j)) < a_i\),这便将 \(a_i\) 与前 \(n-1\) 个数的限制拆开了。我们只需要找到满足条件的 \(a_i\),然后将最后一个数删去,就可以递归子问题了。

发现每删除一个数后,\(\mathrm{lcm}\) 不会增加,那么合法的 \(a_i\) 的集合不会减小,所以可以任意选取 \(a_i\)。如果某一时刻没有合法的 \(a_i\) 了,那么说明无解。

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 105;
int n;
long long a[MAXN];
bool vis[MAXN];
__int128_t lcm(__int128_t a, __int128_t b) {
    return a / __gcd(a, b) * b;
}
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%lld", &a[i]);
    }
    vector<long long> ans;
    for (int i = 1; i < n; i++) {
        for (int j = 1; j <= n; j++) if (!vis[j]) {
            __int128_t l = 1;
            for (int k = 1; k <= n; k++) if (!vis[k] && k != j)
                l = min((__int128_t) a[j], lcm(l, __gcd(a[j], a[k])));
            if (l < a[j]) {
                vis[j] = 1;
                ans.push_back(a[j]);
                break;
            }
        }
        if (ans.size() != i) {
            printf("No\n");
            return 0;
        }
    }
    for (int i = 1; i <= n; i++) if (!vis[i]) {
        ans.push_back(a[i]);
    }
    reverse(ans.begin(), ans.end());
    printf("Yes\n");
    for (long long i : ans) {
        printf("%lld ", i);
    }
    printf("\n");
    return 0;
}

标签:__,ARC122E,Increasing,gcd,int,LCMs,int128,lcm,mathrm
From: https://www.cnblogs.com/apjifengc/p/17274514.html

相关文章

  • 「解题报告」ARC130E Increasing Minimum
    想法大概差不多,但是确实不知道咋维护(考虑每次删最小值的过程,我们相当于先删掉所有最小值\(=1\)的位置,然后删所有最小值\(=2\)的位置,依次类推。那么我们可以将删除的......
  • AT_arc123_b [ARC123B] Increasing Triples 翻译
    题目传送门题目描述$N$项组成的整数列$A=\(A_1\\ldots,\A_N),,B=\(B_1\\ldots,\B_N),,C=\(C_1,\\ldots,\C_N)$。你可以对数列进......
  • Count Increasing Quadruplets
    CountIncreasingQuadrupletsGivena0-indexed integerarray nums ofsize $n$ containingallnumbersfrom$1$to$n$,returnthenumberofincreasingquad......
  • [AGC011E] Increasing Numbers
    非常神秘。考虑一个上升数一定可以拆分成不超过九个形如\(111...(\texttt{k个1})={10^k-1\over9}\)的数之和,我们考虑用九个数\(\{a_1,a_2,...,a_9\}\)来表示一个上升......
  • SPOJ LCMSUM 题解
    LCMSUM题意:求:\(\sum\limits_{i=1}^n\lim(i,n)\)数据范围:\(1\leqT\leq3\times10^5\),\(1\leqn\leq10^6\)。原式\(=\sum\limits_{i=1}^n\frac{i\timesn}{\gc......
  • [数学记录] AGC038C LCMs
    题目柿子Code......
  • [ABC267G] Increasing K Times
    ProblemStatementYouaregivenanintegersequence$A=(A_1,\dots,A_N)$oflength$N$.Findthenumber,modulo$998244353$,ofpermutations$P=(P_1,\dot......
  • LeetCode: 300. Longest Increasing Subsequence
    LeetCode:300.LongestIncreasingSubsequence题目描述Givenanunsortedarrayofintegers,findthelengthoflongestincreasingsubsequence.Example:Input:[10,......
  • 300. Longest Increasing Subsequence
    Givenanintegerarray nums,return thelengthofthelongest strictlyincreasing subsequence. Example1:Input:nums=[10,9,2,5,3,7,101,18]Output:4......
  • SPOJLCMSUM - LCM Sum
    简要题意\(T\)组数据,每组数据给出一个\(n\),计算:\[\sum_{i=1}^{n}{\operatorname{lcm}(i,n)}\]\(1\leqT\leq3\times10^5,1\leqn\leq10^{6}\)思路比较快乐的......