C. Orac and LCM(数论)

C. Orac and LCM(数论)

题目传送门

g 1 = g c d [ l c m ( a 1 , a 2 ) , l c m ( a 1 , a 3 ) l c m ( a 1 , a n ) ] = g c d ( a 1 , l c m ( a 2 , a 3 a n ) ) g_1=gcd[lcm(a_1,a_2),lcm(a_1,a_3)\dots lcm(a_1,a_n)]=gcd(a_1,lcm(a_2,a_3\dots a_n))

g 2 = g c d [ l c m ( a 2 , a 3 ) , l c m ( a 2 , a 4 ) l c m ( a 2 , a n ) ] = g c d ( a 2 , l c m ( a 3 , a 4 a n ) ) g_2=gcd[lcm(a_2,a_3),lcm(a_2,a_4)\dots lcm(a_2,a_n)]=gcd(a_2,lcm(a_3,a_4\dots a_n))

\dots

可以推出 a n s = g c d ( g 1 , g 2 g n ) ans=gcd(g_1,g_2\dots g_n)

l c m lcm 可以用后缀数组维护一下 。

时间复杂度: O ( n l o g n ) O(nlogn)

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
typedef long long ll;
ll suf[N],a[N]; 
ll gcd(ll x,ll y){
	return y==0?x:gcd(y,x%y);
}
int main(){
	int n;
		scanf("%d",&n);
		for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
		for(int i=n;i>=1;i--) suf[i]=gcd(suf[i+1],a[i]);
		ll ans=0;
		for(int i=1;i<=n;i++) ans=gcd(ans,a[i]/gcd(suf[i+1],a[i])*suf[i+1]);
		printf("%lld\n",ans); 
	return 0;
}
	

官方解法:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
typedef long long ll;
ll pre[N],suf[N],a[N]; 
ll gcd(ll x,ll y){
	return y==0?x:gcd(y,x%y);
}
int main(){
	int n;
	scanf("%d",&n);
	scanf("%lld",&a[1]);pre[1]=a[1];
	for(int i=2;i<=n;i++) scanf("%lld",&a[i]),pre[i]=gcd(pre[i-1],a[i]);
	suf[n]=a[n];
	for(int i=n-1;i>=1;i--) suf[i]=gcd(suf[i+1],a[i]);
	ll ans=1;
	for(int i=1;i<=n;i++){
		if(i==1) ans=suf[2];
		else if(i==n) ans=ans/gcd(ans,pre[i-1])*pre[i-1];
		else {
			ll x=gcd(pre[i-1],suf[i+1]);
			ans=ans*x/gcd(x,ans); 
		}
	}
	printf("%lld\n",ans);
	return 0;
}
原创文章 201 获赞 165 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/106092025