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

题目描述
话说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;
		}
	}
 } 

发布了284 篇原创文章 · 获赞 6 · 访问量 3776

猜你喜欢

转载自blog.csdn.net/qq_43690454/article/details/104045520