最大公约数

题目描述

一天,小 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值