gcd的经典套路,枚举gcd即可
P4571 [JSOI2009] 瓶子和燃料 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题意:
思路:
就是让你在n个值里选k个值,使得其gcd最大
即gcd(b1,b2,....bk)最大
设gcd(b1,b2,....,bk)=t
枚举t即可
然后合法性就是看t的出现次数是否>=k
统计最大的t即可
Code:
#include <bits/stdc++.h>
#define int long long
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
const int mxn=1e6+10;
const int mxe=3e5+10;
const int mod=1e9+7;
map<int,int> mp;
int N,K;
int a[mxn];
void solve(){
cin>>N>>K;
for(int i=1;i<=N;i++) cin>>a[i];
for(int i=1;i<=N;i++){
int u=a[i];
set<int> S;
for(int j=1;j<=u/j;j++){
if(u%j==0){
S.insert(j);
if(j!=u/j) S.insert(u/j);
}
}
for(auto it:S) mp[it]++;
}
int ans=0;
for(auto it:mp){
if(it.second>=K) ans=max(ans,it.first);
}
cout<<ans<<'\n';
}
signed main(){
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int __=1;//cin>>__;
while(__--)solve();return 0;
}