首页 > 其他分享 >gcd和lcm真厉害!

gcd和lcm真厉害!

时间:2024-09-23 09:48:03浏览次数:8  
标签:... le gcd 厉害 prod lcm log

做 zr 模拟赛的时候有这样一道题目:

给出 \(n\) 个数 \(a_1,a_2,...,a_n\)。求他们的 lcm \(\bmod 998244353\) 的结果。

\(n\le 5000,a_i\le 10^{18}\)。

用 pollard-rho 的人希望你的考场上也能写出来这个东西,那我就没意见了,我先投降。

考虑最朴素的求 \(n\) 个数的 lcm 的过程:假设我们已经算出了 \(x=lcm(a_1,a_2,...,a_i)\),我们现在想求 \(x\) 和 \(a_{i+1}\) 的 \(\gcd\),然后把 \(x\) 乘上 \(\frac{a_{i+1}}{\gcd(x,a_{i+1})}\) 就是前 \(i+1\) 个数的 lcm。

难点就是求:\(\gcd(a_{i+1},lcm(a_1,a_2,...,a_i))\)。

第一个想法:这个式子显然可以化成:\(lcm(\gcd(a_{i+1},a_1),\gcd(a_{i+1},a_2),...,\gcd(a_{i+1},a_i))\)。而这 \(i\) 个数里的每一个都是 \(a_{i+1}\) 的约数,所以它们的 lcm 结果还是 \(a_{i+1}\) 的约数,也就是范围是 \(\le 10^{18}\) 的。那我们暴力地把 \(i\) 个 \(\gcd\) 都算出来再求 \(lcm\) 即可。

这样得到一个 \(O(n^2\log V)\) 的做法,显然是无法通过 \(n\le 5000\) 的数据的。

这个做法的问题就是没用充分利用到前面已经算出来的信息。事实上算出 \(\gcd(x,a_{i+1})\) 以后,我们令 \(b_{i+1}=\frac{a_{i+1}}{\gcd(x,a_{i+1})}\)。则 \(\prod_{j=1}^{i}b_j\) 就是 \(a_1,a_2,...,a_i\) 的 lcm。相当于我们把 lcm 这个东西化成了乘积这样简单的形式。那想求 \(\gcd(\prod_{j\le i}b_j,a_{i+1})\) 其实是容易的:因为 \(\gcd(a,b)=\gcd(a\bmod b,b)\)。我们只需要算 \(\prod_{j\le i}b_j\) 对 \(a_{i+1}\) 取模的结果,最后求一次 \(\gcd\) 就可以得到 \(b_{i+1}\)。

此时得到一个 \(O(n^2+n\log V)\) 的做法,就可以通过了。

如果只到这里肯定是不够写一篇的。我们来做这样一个问题:

给出 \(n\) 个数 \(a_1,a_2,...,a_n\)。对每个区间 \([l,r]\) ,求 \(lcm(a_l,a_{l+1},...,a_r)\) 对 \(998244353\) 取模的结果。

数据范围还是 \(n\le 5000,a_i\le 10^{18}\)。

套用上面的做法对每个左端点跑只能做到 \(O(n^3+n^2\log V)\) 的复杂度。我们的核心思路还是找到合适的 \(b_i\) 使得 lcm 能被表示成 \(b_i\) 的乘积的形式。当然你肯定找不到一组 \(b_i\) 满足对于任何的 \([l,r]\) 都有 \(b_l\times ...\times b_r=lcm(b_l,...,b_r)\),哪有这么好的事情?考虑不断往序列后追加一个元素。然后 \(b_i\) 只需要满足后缀 \(b_i\) 的乘积是后缀的 lcm,拥有这个事情就足够了。

比如说我们添加了一个 \(a_{n+1}=v\) 这样的元素,显然有 \(b_{n+1}=v\),怎么修改 \(b_1\sim b_n\) 呢。从后往前枚举 \(b_i\),令 \(g=\gcd(v,b_i)\),则我们会把 \(b_i\) 和 \(v\) 都是除以 \(g\),然后接着考虑 \(i-1\)。朴素地做这样一个去更新 \(b_i\),就得到一个 \(O(n^2\log V)\) 的做法。瓶颈原因还是求 gcd 次数太多。

令 \(c_i\) 是枚举到 \(b_i\) 的时候此时 \(\gcd(b_i,v)\) 的值,也就是说 \(b_i\) 要除以多少。那 \(\prod_{j=i}^{n}c_j\) 其实就是 \(\gcd(\prod_{j=i}^{n}b_j,v)\) 啊。后面这个形式看着就很眼熟。我们算出 \(b_j\) 的后缀积 \(s_j\) 模 \(v\) 的值,这可以 \(O(n)\) 算出。那 \(\prod_{j=i}^{n}c_j\) 就是 \(\gcd(s_j,v)\)。这有什么用呢?因为 \(c\neq 1\) 的位置只有 \(O(\log V)\) 处,如果我们能找到这些位置,就可以把瓶颈处的 \(O(n^2\log V)\) 降下来,不用求那么多次 gcd 了。

而 \(\gcd(s_i,v)\neq gcd(s_{i+1},v)\) 的充要条件是 \(s_{i+1}\bmod \gcd(s_i,v)\neq 0\)。(这是因为 \(s_{i+1}\mid s_i\) 而产生的性质)。说人话就是如果我们知道了 \(\gcd(s_i,v)\) 的值,然后我们已经知道了 \(s_{i+1}\bmod v\) 的值了,那就可以 \(O(1)\) 判断 \(\gcd(s_{i+1},v)\) 是否和 \(\gcd(s_i,v)\) 相等。那就可以 \(O(1)\) 判断 \(c_{i}\) 是否 \(\gt 1\)。那第一步算一下 \(\gcd(s_1,v)\) 就行了啊。

这样我们只用求 \(n\log V\) 次 \(\gcd\)。不过大家应该都知道对一个数重复替换成他和另一个数的 \(\gcd\),这样一个过程均摊还是 \(O(\log V)\) 的。所以总复杂度就是 \(O(n^2+n\log V)\)。就算实现的菜了一点变成了 \(n\log^2 V\) 也没问题,反正他不是瓶颈。

标签:...,le,gcd,厉害,prod,lcm,log
From: https://www.cnblogs.com/Cry-For-theMoon/p/18426320

相关文章

  • CF2013E prefix gcd
    给n个数,随意排序,所有前缀的gcd的和的最小值。只想到gcd变化是log次的,所以枚举每个作为开头,然后找让gcd变小的接上。可是这样是\(O(n^2)\).注意,最小的数要放最前面。假设\(x,a_1,a_2....\)和\(a_1,a_2,x...\).(x是最小的)我们有\(x+gcd(a_1,x)\leqa_1\),因为gcd的求法是\(a_......
  • 厉害了,小米今年要新招 5000 人!
    大家好,我是糖糖!在国庆节即将来临之际,特意上号跟大家说一句:“国庆佳节,举国欢庆。愿您事业八面玲珑,爱情五味俱全,人生七彩缤纷,生活四季如春。祝您国庆快乐,幸福安康”。前几天,看到雷总在给2024届小米应届生迎新典礼演讲中,说了一些小米在应届生招聘方面的数据,小米在去年2023届......
  • 公有云数据库厂商增长太厉害了!DBA要失业了?
    未来数据库的战场主要是公有云,且公有云的比重确实也在逐年上市,那么是不是这么回事呢?我们来分别看下几个云厂商巨头的公有云营收和增速!全球公有云王者AWS2022年半年报:2023年半年报:2024年半年报:这里大概总结一下AWS最近3年半年报的情况:2022381.8亿美金2023434.9亿美金......
  • GBase GCDW warehouse相关权限
    GCDW中,warehouse相关权限有三个,MODIFY_WAREHOUSE、OPERATE_WAREHOUSE、USAGE_WAREHOUSE;对应功能如下:MODIFY_WARHEOUSE:允许角色创建,删除,启动,挂起,修改warehouse属性的权限。OPERATE_WAREHOUSE:允许角色使用warehouse资源执行sql的权限,同时如果目标warehouse正处于suspend......
  • GBase GCDW云数据仓库的租户和用户介绍
    【GCDW租户】GCDW实例需云用户注册GCDW租户成功后,GBASE云服务系统给租户分配独立的实例,同时创建租户的数据库根用户,根用户即为该实例的超户,拥有该实例的最高权限,租户可以通过根用户登录自己的实例管理数据,也可以根据业务安全需求创建不同权限的角色和用户来管理数据。每个......
  • 【人生感悟】真正厉害的人,这种思维都很强大
    我们都身处信息爆炸的时代,各种资讯蜂拥而至,很难保证所接收的信息都是准确的。在这样的情况下,拥有“穿透迷雾,直击核心”的能力非常关键。虽然钻研各个领域的专业知识可以帮助我们避免信息误导,但这个过程可能超出我们想象地漫长。事实上,真正厉害的人都有一个共同点——他们善于......
  • Exgcd 和 Excrt 的一些推导
    Exgcd和Excrt的一些推导ExgcdExgcd是用来求解二元一次不定方程的算法,即\[ax+by=c\]根据贝祖定理,该方程有解当且仅当\(\gcd(a,b)\midc\),所以只用求解\[ax+by=\gcd(a,b)\]又因为\[\gcd(a,b)=\gcd(b,a\bmodb)\]可以先求解\[bx'+(a\bmodb)y'=\gcd(a,b)\]变形得\[......
  • P11036 【MX-X3-T3】「RiOI-4」GCD 与 LCM 问题
    P11036【MX-X3-T3】「RiOI-4」GCD与LCM问题题意描述给出\(a\),求一组构造\(b,c,d\)使得\(a+b+c+d=gcd(a,b)+lcm(c,d)\)同时需要保证\(b,c,d\le1634826193\)思路变量实在太多了,考虑先大胆消掉一个,令\(b=1\),此时问题简化为使得\(a+c+d=lcm(c,d)\)赛时真的没想出......
  • 『做题记录』厉害trick集
      不出意外的话,这就是我最后的波纹了吧。  当然以后还会继续的。减半警报器  这个trick能将\(n^2\)的东西硬生生优化到\(n\log^2\),还是很厉害的trickP7603[THUPC2021]鬼街Description  鬼街上经常有灵异事件,每个灵异事件会导致编号为\(x\)的质因子的房子......
  • GCD Queries
    GCDQueries交互题。发现一个结论:对于三个数\(a,b,c\),我们询问\(ga=\gcd(a,c),gb=\gcd(b,c)\)。若\(ga=gb\),则\(c\not=0\)若\(ga>gb\),则\(b\not=0\)若\(ga<gb\),则\(a\not=0\)也就是说,进行两次询问可以排除掉一个位置,那么我们一共只需要进行\(2(n-2)\)次询......