http://codeforces.com/contest/876/problem/B
题意: 就是给你n个数,让你在这n个数中找到一个有k个元素的集合,在这个集合中,两两相减所得到的差是m的倍数。
思路 :两数做差是m的倍数可以等价于两数取余m所得到的值相同,直接一个桶排就好了。
上代码吧:
#include <stdio.h>
#include <string.h>
#include <vector>
#include <iostream>
using namespace std;
const int maxn = 110000;
vector<int>a[maxn];
int b[maxn];
int main()
{
int n,k,m,t;
memset(a,0,sizeof(a));
scanf("%d%d%d",&n,&k,&m);
for(int i =0 ; i < n; i++)
{
scanf("%d",&t);
a[t%m].push_back(t);
}
int cnt = 0,flag = 0;
for(int i = 0 ;i < m ;i++)
{
if(a[i].size()>=k)
{
cnt = i;
flag = 1;
break;
}
}
if(flag)
{
puts("Yes");
for(int i = 0 ; i <k;i++)
{
cout<<a[cnt][i]<<" ";
}
puts("");
}
else
{
puts("No");
}
}