其他分享
首页 > 其他分享> > 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;
}

标签:P4571,ch,read,JSOI2009,long,瓶子,int,ans,define
来源: https://www.cnblogs.com/Akmaey/p/15169204.html