Codeforces Round#641 Div2C問題解決

トピック

正の整数の多重集合s = {s1、s2、…、sk}の場合、sの最大公約数(GCD)と最小公倍数(LCM)を次のように定義します。

gcd(s)は、sのすべての整数がxで割り切れるような、最大の正の整数xです。
lcm(s)は最小の正の整数xであり、sからのすべての整数で割り切れます。
たとえば、gcd({8,12})= 4、gcd({12,18,6})= 6およびlcm({4,6})= 12です。正の整数xの場合、gcd({x})= lcm({x})= xであることに注意してください。

Oracには長さnのシーケンスaがあります。彼は多重集合t = {lcm({ai、aj})を思いついた| i <j}、そして彼のためのgcd(t)の値を見つけるようにあなたに頼んだ。つまり、指定されたシーケンスの要素のすべてのペアのLCMのGCDを計算する必要があります。

入力
最初の行には、1つの整数n(2≤n≤100000)が含まれています。

2行目には、n個の整数a1、a2、…、an(1≤ai≤200000)が含まれています。

出力
1つの整数を出力します:gcd({lcm({ai、aj})| i <j})。

質問の意味は、単にn個の数値を与えて、gcd({lcm({ai、aj})| i <j})を見つけることです。これは、lcmのすべてのペアのgcdを見つけることを意味します。
解決策
まず、結論を出します。最終的な答えgcd:ansの場合、p ^ k | ansの場合、n個の数値のうち少なくともn-1個でp ^ kを除算できます。
ここでは証明はありません。実際、タイトルのgcdとlcmについて考えることも、結論を導き出すことができます。
解決策1
セットdiを、aiがセットから削除された後に残った数字のセットとして定義します。つまり、d1 = {a2、a3、...、an}などです。したがって、d1の場合、gcd(di)= gcd(a2、a3、...、an)で割り切れる数が少なくともn-1個あることがわかります。したがって、gcd(a2、a3、...、an)| ansは、前の結論からgcd(d1)| ansであることがわかります。同様に、gcd(d2)| ans、gcd(d3)| ans、...、gcd(dn)| ansはgcd(di)| ans(1 <= i <= n)であり、要約するとans = lcm (gcd(d1)、gcd(d2)、gcd(d3)...、gcd(dn))。
gcd(di)を要求する方法については、暴力を要求してはなりません。そうしないと、鉄のGGになります。pre(i)= gcd(a1、a2、...、ai)、suf(i)= gcd(ai、ai + 1、...、an)がプレフィックスgcdでサフィックスgcdであることを忘れないでください。gcd(di)の場合、その意味はaiを除くセット内のすべての数値のgcdであるため、gcd(di)= gcd(pre(i-1)、suf(i + 1))は次のように表されます。aiの前の数値のgcd aiに続く番号のgcdのgcdが必要です。

おすすめ

転載: blog.csdn.net/ylwhxht/article/details/106107443