1. 程式人生 > 其它 >P4571 [JSOI2009]瓶子和燃料

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;
}