C. Nikita and LCM

题解

如果整个数组的最小公倍数比数组最大值大的话就直接输出n;

否则满足题目条件的最长子数组的最小公倍数一定是数组最大值的因子。

因此我们只需要去遍历数组最大值的每个因子是否符合条件即可。

code

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2005;
ll a[N];
int n;
ll check(ll lcm){
    ll gcd=1;
    ll ans=0;
    for (int i=1;i<=n;i++){
        if (lcm%a[i]!=0) continue;
        gcd=gcd/__gcd(gcd,a[i])*a[i];
        ans++;
    }
    if (gcd==lcm) return ans;
    return 0;
}
void solve(){
    map<int ,int > val;
    ll MAX=0;
    ll gcd=1;
    cin>>n;
    for (int i=1;i<=n;i++){
        cin>>a[i];
        MAX=max(MAX,a[i]);
        val[a[i]]=1;
    }
    for (int i=1;i<=n;i++){
        gcd=gcd/__gcd(gcd,a[i])*a[i];
        if (gcd>MAX){
            cout<<n<<endl;
            return;
        }
    }
    ll ans=0;
    for (ll i=2;i*i<=MAX;i++){
        if (MAX%i!=0) continue;
        if (!val.count(i)) ans=max(ans,check(i));
        if (!val.count(MAX/i)) ans=max(ans,check(MAX/i)); 
    }
    cout<<ans<<endl;
}
int main(){
//    freopen("input.txt","r",stdin);
    int t;
    cin>>t;
    while (t--){
        solve();
    }
    return 0;
}

 

posted @ 2024-05-29 15:40  黑屿白  阅读(36)  评论(0)    收藏  举报