P4571 [JSOI2009]瓶子和燃料

题目

P4571 [JSOI2009]瓶子和燃料

分析

使用裴蜀定理可以很容易转化成:给 \(n\) 个数选择其中 \(k\) 个可以得到的最大公因数。

考虑最大公因数的求法,在唯一分解定理之下其实就是对质因数的指数取 \(min\)

于是对所有数分解因数,找到出现次数大于 \(k\) 的因数即可,贪心取最大值。

代码

#include<bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x){
    x=0;char ch=getchar();bool f=false;
    while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();}
    while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    x=f?-x:x;
    return ;
}
template <typename T>
inline void write(T x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10^48);
    return ;
}
const int N=1e5+5,M=1e6+5,MOD=1e9+7;
#define ll long long
#define ull unsigned long long
#define inc(x,y) (x+y>=MOD?x+y-MOD:x+y)
#define dec(x,y) (x-y<0?x-y+MOD:x-y)
int n,k,ans;
map<int,int>Map;
int main(){
	read(n),read(k);
	for(int i=1,x;i<=n;i++){
		read(x);
		for(int j=1;j*j<=x;j++){
			if(x%j==0) Map[j]++,Map[x/j]++;
		}
	}
	for(map<int,int>::iterator it=Map.begin();it!=Map.end();it++){
		if((*it).second>=k) ans=max(ans,(*it).first);
	}
	write(ans);
	return 0;
}
posted @ 2021-08-21 11:53  __Anchor  阅读(32)  评论(0编辑  收藏  举报