计信选拔赛 E-gcd!!!

题目描述

链接:https://ac.nowcoder.com/acm/contest/13017/E

给定一个数组,可以往数组里添加一个数(不大于当前数组最大值),然后从中任选k个数,使得他们GCD(最大公因数)最大。

思路:

记录每一个数的因子出现的次数,取最大的因子且出现的次数大于等于k-1的,就是答案。暴力枚举。

代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int t,n,k,a[N],cnt[N];

int main()
{
    cin>>t;
    while(t--){
        cin>>n>>k;
        int mx=-1;
        memset(cnt,0,sizeof(cnt));
        for(int i=0;i<n;i++){
            cin>>a[i];
            mx=max(mx,a[i]);
            for(int j=1;j*j<=a[i];j++){
                if(a[i]%j==0){
                    cnt[j]++;//统计每个因子出现过的次数
                    if(j*j!=a[i]) cnt[a[i]/j]++;
                } 
                
            }
        }
        int ans=0;
        for(int i=1;i<=mx;i++){
           // cout<<cnt[i]<<" ";
            if(cnt[i]>=k-1) ans=i;//满足大于等于k-1的条件,就更新答案
        }
        cout<<ans<<endl;
    }
    
}

全部评论

相关推荐

死在JAVA的王小美:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,我也是,让我免了一轮,但是硬气拒绝了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务