题目描述
一天,小 Y 意外得到了一些糖果。小 Y 是个很大方的人,于是,他决定把一些糖果分给他的朋友们。
小 Y 将糖果分成了 n 份,第 i份有 ai颗糖果。小 Y 有 k 个朋友,于是他准备选择其中的 k份,送给他的朋友们。但是,考虑到这样分的话,每个朋友送的糖果数不一样,分到的糖果少的人就会不高兴。于是,小 Y 决定,送给每个人的糖果数都是这 k份糖果的数目的最大公约数。
作为小 Y 的朋友之一,为了得到更多的糖果,你需要计算一下,小 Y 最多需要拿出多少糖果。
输入
第一行两个正整数 n 和 k,之间有一个空格。
第二行 n个正整数,表示每份的糖果数,每两个数之间有一个空格。
输出
输出一行一个正整数,表示小 Y 最多需要拿出多少糖果。(即最大公约数×K)
样例输入
3 1
1 2 3
样例输出
3
数据范围
30%的数据:k≤n≤20;
50% 的数据:输入中所有数小于等于 5000;
100% 的数据:输入中所有数小于等于 500000,k≤n。
思路
30分:DFS搜所有方案
50~80分:枚举最大公约数的值
100分:枚举1x,2x,······500000/x,s[i*x]是否存在
code
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
const int N=500005;
int a[N];
int mx(int x,int y)
{
return x>y?x:y;
}
int n,k;
int b[N];
long long ans;
int main()
{
int i,j,r=1;
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
r=mx(r,a[i]);
b[a[i]]++;
}
for(i=r;i>=1;i--)
{
int cnt=0;
for(j=r/i;j>=1;j--)
{
cnt+=b[i*j];
}
if(cnt>=k)
{
printf("%lld",i*1ll*k*1ll);
return 0;
}
}
return 0;
}