BZOJ 2257 JSOI2009 瓶子和燃料 数论

来源:互联网 发布:适用于mac的杀毒软件 编辑:程序博客网 时间:2024/04/28 16:14

题目大意:给定n个瓶子,选择k个,可以随便导油,问选择k个瓶子可以导出的油数量的最小值的最大值

首先易知k个瓶子能导出的油最小值一定是k个瓶子容量的最大公因数 于是问题转化成了在n个数中选择k个 使最大公因数最大

找出n个数的所有因数 排序 找出最大的且出现次数大于等于k的输出即可

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define M 1600100using namespace std;int n,k;int factors[M],tot;void Get_Factors(int x){int i;for(i=1;i*i<x;i++)if(x%i==0)factors[++tot]=i,factors[++tot]=x/i;if(i*i==x)factors[++tot]=i;}int main(){int i,x;cin>>n>>k;for(i=1;i<=n;i++){scanf("%d",&x);Get_Factors(x);}sort(factors+1,factors+tot+1);int cnt=0;for(i=tot;i;i--){if(factors[i]!=factors[i+1])cnt=0;++cnt;if(cnt==k){printf("%d\n",factors[i]);return 0;}}}


0 0
原创粉丝点击