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/
作者
yozora0908
发布于
2022年7月6日
许可协议