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;
}

posted @ 2024-05-28 17:19  纯粹的  阅读(68)  评论(0)    收藏  举报