问题 C: 公约数------枚举/数论

50 篇文章 1 订阅

题目描述
话说CD比较⽋扁,他表示在课室的日⼦没有教主在旁边打他的日⼦太寂寞了,所以这⼀晚,他终于来到了电脑室被打。由于CD是⼤家的宠物,于是⼤家都来打CD了。
电脑室里有n个⼈,第i个⼈希望打CD ai下。但是太多⼈打CD,他又会不爽,于是他规定只能有K个⼈打到他,并且为了公平起见,最终K个⼈打他的次数都必须是相同的,CD规定这个次数就是这K个⼈希望打他的次数的最⼤公约数。为什么是最⼤公约数呢?因为他觉得被打的次数是GCD的话他才会变成Glad CD。
之前说了,CD比较⽋扁,于是CD希望,K个⼈打他的次数的和最⼤。你能告诉他他最后总共会被打多少下么?
输入
第⼀⾏两个正整数n,k。
第⼆⾏n个正整数,表示每个⼈希望打CD多少下。
输出
输出⼀个正整数表示CD会被打多少下。
样例输入 Copy
3 1
1 2 3
样例输出 Copy
3
提示
对于30%的数据,保证k≤n≤20。
对于50%的数据,保证输⼊中所有数小于5000。
对于100%的数据,保证输⼊中所有数小于500000,k≤n。

解析:枚举答案ans,看有多少个是ans的倍数,只要>=k,即满足条件

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+100;
int n,k,x;
typedef long long ll;
int a[N];
int main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++) 
	{
		cin>>x;
		a[x]++;
	}
	for(int i=500000;i;i--)
	{
		int cnt=0;
		for(int j=i;j<=500000;j+=i) cnt+=a[j];
		if(cnt>=k)
		{
			cout<<(ll)i*k<<endl;
			return 0;
		}
	}
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值