计信选拔赛 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; } }