Orac and LCM CodeForces

#include<vector>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const int N=200005;
int primes[N];
bool st[N];
int cnt;
void init(int n)
{
	memset(st, 0, sizeof st);
	cnt = 0;
	for (int i = 2; i <= n; i ++ )
	{
		if (!st[i]) 
			primes[cnt ++ ] = i;
		for (int j = 0; primes[j] * i <= n; j ++ )
		{
			st[i * primes[j]] = true;
			if (i % primes[j] == 0) break;
		}
	}
}
ll a[N];
vector<ll>v[N];
int n;

void div(int x)
{
	for(int i=0; i<cnt; i++)
	{
		if(x<primes[i]*primes[i])
			break;
		if(x%primes[i]==0)
		{
			ll ans=0;
			while(x%primes[i]==0)
			{
				ans++;
				x/=primes[i];
			}
			v[primes[i]].push_back(ans);
		}
	}
	if(x>1)
		v[x].push_back(1);
}
int calc(int x,int y)
{
	int ans=1;
	for(int i=1; i<=y; i++)
		ans*=x;
	return ans;
}
int main()
{
	init(N);
	cin>>n;
	for(int i=1; i<=n; i++)
		cin>>a[i],div(a[i]);
	ll ans=1;
	for(int i=0; i<cnt; i++)
	{
		ll x=primes[i];
		if(v[x].size()==0)
			continue;
		sort(v[x].begin(),v[x].end());
		int y=v[x].size();
		if(y==n)
		{
			int z=max(v[x][0],v[x][1]);
			ans*=calc(x,z);
		}
		else if(y==n-1)
			ans*=calc(x,v[x][0]);
	}
	cout<<ans<<endl;
	return 0;
}
原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12882046.html