CF1349A Orac and LCM 题解
分析
\[ \gcd_{i,j \in [1,n] \text{ and } i< j} \{ \operatorname{lcm}(a_i,a_j) \} \]
\[ \gcd_{i,j \in [1,n] \text{ and } i < j} \{ \frac{a_i \cdot a_j}{\gcd(a_i,a_j)} \} \]
两两元素的最大公约数就是整个序列的最大公约数。\(\gcd(ka,kb)=k \gcd(a,b)\)。 \[ \frac{\gcd_{i,j \in [1,n] \text{ and } i < j} \{a_i,a_j \} }{\gcd \{ a_1,a_2 \ldots a_n \}} \] 对于 \(i \in [1,n]\),它对分数线上面的式子的贡献是 \(\gcd(a_i,a_{i+1} \ldots a_{n})\),预处理后缀 \(\gcd\) 即可。
CODE
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+7;
int n;
ll a[N], d[N];
ll gcd(ll x,ll y) { return y? gcd(y,x%y):x; }
ll lcm(ll x,ll y) { return x/gcd(x,y)*y; }
ll read() {
ll a=0; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) a=a*10+c-'0', c=getchar();
return a;
}
int main() {
ll ans=0;
n=read();
for(int i=1;i<=n;++i) a[i]=read();
for(int i=n;i;--i) d[i]=gcd(a[i],d[i+1]);
for(int i=1;i<=n;++i) ans=gcd(ans,a[i]*d[i+1]);
printf("%lld\n",ans/d[1]);
}
CF1349A Orac and LCM 题解
https://yozora0908.github.io/2022/cf1349a-solution/