CodeForces-876B Divisiblity of Differences
标签:水题
/*
题意:给n个数,选k个,要求在k里面任选2个数都能被m整除。
注意n里面可以有相同的数。
思路:对每个数initial[i],保存initial[i]%m在mod[i]。
找出现次数(ans)最多的那个余数,若ans >= k,有解;否组无解。见代码。
*/
#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxn = 100005;
int initial[maxn], mod[maxn];
int main()
{
int n, k, m;
while(scanf("%d %d %d", &n, &k, &m) != EOF)
{
for(int i = 0; i < n; i++)
{
scanf("%d", &initial[i]);
mod[i] = initial[i] % m; //
}
sort(mod, mod + n); //找出现次数(ans)最多的那个余数
int temp = mod[0], total = 0, ans = 0, flag;
for(int i = 0; i < n; i++)
{
if(temp == mod[i]) total++;
else
{
temp = mod[i];
total = 1; //total = 1
}
if(total > ans)
{
ans = total;
flag = temp;
}
}
if(ans >= k) //输出
{
printf("Yes\n");
int time = 0;
for(int i = 0; i < n; i++)
{
if(initial[i] % m == flag && time < k) //time < k, 选k个数
{
printf("%d ", initial[i]);
time++;
}
}
printf("\n");
}
else printf("No\n");
}
return 0;
}