C. Nikita and LCM
题解
发现一串数字的lcm一定大于等于这一串数字的最大值,所以如果整个数组的lcm大于 \(a_{max}\) ,直接输出n
否则,注意这里的思维,否则,剩余数字组成的lcm一定小于等于 \(a_{max}\) 且是 \(a_{max}\) 的因子
code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[2005];
int n;
map<ll,bool> vis;//是否在数组中
ll check(ll lcm)
{
ll tem=1;
ll cnt=0;
for(int i=1;i<=n;i++)
{
ll val=a[i];
if(lcm%val) continue;
tem=tem/__gcd(tem,val)*val;//该数字能作为组成lcm的一部分
cnt++;
}
if(tem==lcm) return cnt;//能不能达到这个lcm
return 0;
}
void solve()
{
cin>>n;
ll maxs=0;
for(ll i=1;i<=n;i++)
{
cin>>a[i];
vis[a[i]]=1;
maxs=max(maxs,a[i]);
}
ll tem=1;
for(ll i=1;i<=n;i++)
{
tem=tem/__gcd(tem,a[i])*a[i];//求lcm
if(tem>maxs)
{
cout<<n<<"\n";
return;
}
}
ll ans=0;
for(ll i=2;i*i<=tem;i++)//寻找可能的lcm
{
if(tem%i) continue;
if(!vis[i]) ans=max(ans,check(i));//不在数组中的lcm
if(!vis[tem/i]) ans=max(ans,check(tem/i));
}
cout<<ans<<"\n";
vis.clear();
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
ll t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}

浙公网安备 33010602011771号