题目大意:给定n个瓶子,选择k个,可以随便倒油,问最大化选择k个瓶子可以倒出的油数量的最小值
题解:我拿两个瓶子YY了一下,以为是取模……好吧,大概类似于辗转相减,所以对两个瓶子,答案为gcd(x,y)
由裴蜀定理,若干整数的线性组合一定为它们gcd的倍数,且存在一组解为gcd
于是问题变成了n个数中选k个,最大化gcd
对每个数分解因数,找最大且出现至少k次的因数即可
O(nv√)
我的收获: 裴蜀定理应用……
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int n,k,tot,res,x,cnt[1000005];
void fj(int x)
{
int i;
for(i=1;i*i<=x;i++)
if(x%i==0) cnt[++tot]=i,cnt[++tot]=x/i;
if(i*i==x) cnt[++tot]=i;//特判……
}
void work()
{
for(int i=tot;i;i--){
if(cnt[i]!=cnt[i+1]) res=0;
res++;
if(res==k){printf("%d\n",cnt[i]);break;}
}
}
void init()
{
cin>>n>>k;
for(int i=1;i<=n;i++) scanf("%d",&x),fj(x);
sort(cnt+1,cnt+1+tot);
}
int main()
{
init();
work();
return 0;
}