首页 > 其他分享 >[ARC124C] LCM of GCDs 题解

[ARC124C] LCM of GCDs 题解

时间:2023-12-16 11:55:21浏览次数:36  
标签:dots gcd int 题解 ARC124C MAXN gb ga LCM

题目跳转

Fake_Solution

前言

[warning]: 本题解的做法是错法,但是正确概率贼高。离谱的是正确率还可以叠加。

正解是记搜,时间复杂度可以证明。正解看文末。

思考

众所周知一个公式:

\[a\times b=\operatorname{lcm}(a,b)\times \gcd(a,b) \]

如果你不知道——自证吧,不难。

于是,移一下项可得

\[\operatorname{lcm}(a,b)=\frac{ab}{\gcd(a,b)} \]

那本题就是求这个玩意儿(设 \(g(a,b)=\gcd(a,b)\), \(g(X)=g(x_1,\dots,x_n)\))

\[\frac{g(X)\times g(Y)}{g(g(X),g(Y))} \]

关键是,我们怎么求得这个分数呢?

观察一手分母,实际上就是

\[g(g(x_1,\dots,x_m),g(x_1,\dots,x_m))\\\Downarrow\\g(x_1,\dots,x_m,y_1,\dots,y_m)\\\Downarrow\\g(a_1,\dots,a_n) \]

也就是说无论怎么放置卡片,分母是始终不变的。都可以根据给出的值求得。

分子怎么办呢?

由于是 \(g(X)\times g(Y)\),我们可以试着贪心去取较大值。然后一路 \(O(n)\) 下去就好了。

但是会有问题(极小概率),给个 hack。

3
7175 27378
9184 26427
29992 7190

但是,数据出现这种卡贪心的情况概率极低。Atcoder 的 70 组数据也就一组。

为了提高正确率,我们可以倒着再跑一次。

是的,你没听错,就是贪心 + 乱搞。

代码

code

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

#define int long long

const int MAXN = 50 + 5;

int n;
int a[MAXN], b[MAXN];

int solve() {
    int x = a[1], y = b[1];
    for (int i = 2; i <= n; i++) {
        int nx = __gcd(x, a[i]);
        int ny = __gcd(y, b[i]);
        int mx = __gcd(x, b[i]);
        int my = __gcd(y, a[i]);
        if (nx * ny > mx * my)
            x = nx, y = ny;
        else
            x = mx, y = my;
    }
    return x * y / gcd(x, y);
}

signed main() {
    scanf("%lld", &n);
    for (int i = 1; i <= n; i++) scanf("%lld%lld", &a[i], &b[i]);
    int ans1 = solve();
    for (int i = 1, j = n; i <= j; i++, j--) swap(a[i], a[j]), swap(b[i], b[j]);
    int ans2 = solve();
    printf("%lld\n", max(ans1, ans2));
    return 0;
}

Solution

还是补一个正解做法。其实直接记忆化爆搜就好了,时间复杂度可以证明通过本题限制(虽然我不会)

代码

code

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

#define int long long

const int MAXN = 50 + 5;

int n;
int a[MAXN], b[MAXN];
struct node {
    int x, ga, gb;
    node(int a = 0, int b = 0, int c = 0) {
        x = a;
        ga = b;
        gb = c;
    }
    bool operator<(const node &T) const {
        if (x != T.x)
            return x < T.x;
        if (ga != T.ga)
            return ga < T.ga;
        return gb < T.gb;
    }
};
int ans;
map<node, bool> vis;

int lcm(int a, int b) { return a * b / __gcd(a, b); }

void dfs(int x, int ga, int gb) {
    if (vis[node(x, ga, gb)])
        return;
    vis[node(x, ga, gb)] = 1;
    if (x == n + 1) {
        ans = max(ans, lcm(ga, gb));
        return;
    }
    dfs(x + 1, __gcd(ga, a[x]), __gcd(gb, b[x]));
    dfs(x + 1, __gcd(ga, b[x]), __gcd(gb, a[x]));
}

signed main() {
    scanf("%lld", &n);
    for (int i = 1; i <= n; i++) scanf("%lld%lld", &a[i], &b[i]);
    dfs(2, a[1], b[1]);
    printf("%lld\n", ans);
    return 0;
}

标签:dots,gcd,int,题解,ARC124C,MAXN,gb,ga,LCM
From: https://www.cnblogs.com/wang-holmes/p/17904655.html

相关文章

  • CF327C Magic Five 题解
    题目传送门前置知识等比数列求和公式|乘法逆元解法设\(lena\)表示\(a\)的长度。首先,若一个数能被\(5\)整除,则该数的末尾一定为\(0\)或\(5\)。故考虑枚举\(a\)中所有的\(0\)和\(5\)的下标,设此下标后面有\(x\)个数字,由于\(s\)是由\(a\)复制\(k\)遍形......
  • gamble 题解报告
    #Galble题解简要题意:  给定一个数$n$AB两人赌博,每次你作为第三者下注任意整数$x$元,A赢则获得$x$元,否则亏损$x$元。任何一个人赢$n$次立刻结束游戏。你需要每次基于现在的情况,计算下的赌注,以使得在整个赌博的全过程,如果A胜利则获得$2^{2n-1}$元,否则亏损这么......
  • 题解 CF1887E【Good Colorings】
    萌萌交互题。对网格图进行二分图建模,左部\(n\)个点表示每一行,右部\(n\)个点表示每一列。若格子\((i,j)\)被染成\(c\)色,就连接\((L_i,R_j,c)\)的边。由抽屉原理易证,在初始局面中至少有一个各边颜色均不同的偶环。获胜条件相当于存在一个各边颜色均不同的四元环。讨论......
  • 洛谷P1824 进击的奶牛 题解 二分答案
    题目链接:https://www.luogu.com.cn/problem/P1824题目大意:本题相当于在\(n\)个数中选\(c\)个数,使得这\(c\)个数中相差最小的两个数之差尽可能地大。解题思路:我们首先可以给\(a_1\sima_n\)从小到大排一下序(这里有点贪心的思想,你会发现很多涉及贪心的问题在排序之后解......
  • ABC332G Not Too Many Balls 题解
    第\(i\)种球有\(a_i\)个,共\(n\)种。第\(i\)种箱子最多共装\(b_i\)个球。共\(m\)种。第\(i\)种球在第\(j\)种箱子里至多放\(ij\)个。问所有箱子放的球数最多是多少。\(1\leqn\leq500,1\leqm\leq5e5,0\leqa_i,b_i\leq1e12\)。很容易建出网络流模型。......
  • CF1784C Monsters (hard version) 题解 线段树
    题目链接:https://codeforces.com/problemset/problem/1784/C题目大意:你面前有\(n\)只怪兽,每只怪兽都有一个初始血量,你可以进行两类操作:操作1:选择任意一个血量大于\(0\)的怪兽,并将它的血量降低\(1\);操作2:将所有存活的怪物的血量各自减去\(1\),如果存在怪物的血量恰好降为......
  • PTA-2023第十三次练习题目题解
    PTA-2023第十三次练习题目题解以下代码已做防抄袭处理,切勿抄袭。注意:手机端因为屏幕限制,代码会有(不希望的)换行。解决方案:1.建议使用电脑端打开。2.点击代码进入全屏观看。6-25实验9_5_反向打印字符串思路就是每次先找到字符串的最后一位,然后输出这一位,输出之后将这一位改为‘......
  • P8818 [CSP-S 2022] 策略游戏 题解
    P8818[CSP-S2022]策略游戏题解题目链接P8818[CSP-S2022]策略游戏简化题意小\(A\)先在\(a[l1,r1]\)中选择一个数\(x\),小\(B\)再在\(b[l2,r2]\)中选择一个数\(y\),最后的分数就是\(x\timesy\)。小\(A\)想让分数尽可能地大,而小\(B\)则想让分数尽可能地小......
  • 【问题解决】unable to do port forwarding: socat not found
    问题复现前阵子应公司要求做华为云平台的调研,写了一篇文档包含将华为云CCE下载kuberctl配置及使用kubectl转发流量到本地的操作。今天一早上同事就发来一个错误界面,说是Java远程调试转发过来的端口出现问题,如下图:处理思路最初以为是容器镜像未安装socat所致,安装重新打镜像后......
  • 12月13日80端口被占用问题解决
    在写软件构造作业的时候,发现Jfinal提示java.lang.IllegalStateException:port:80notavailable!原因是因为我们的80端口被占用了,当我们输入localhost的时候出现的是windows iis服务的界面这个时候需要我们关闭windowsiis服务1.点击开始收索服务,在服务界面找到worldWide......