题目链接:http://codeforces.com/contest/876/problem/B
题意:
给你n个数a[i],让你找出一个大小为k的集合,使得集合中的数两两之差为m的倍数。
若有多解,输出任意一个集合即可。
题解:
若一个集合中的数,两两之差为m的倍数,则他们 mod m 的值均相等。
所以O(N)扫一遍,对于每个数a:vector v[a%m].push_back(a)
一旦有一个集合大小为k,则输出。
AC Code:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <vector> 5 #define MAX_M 100005 6 7 using namespace std; 8 9 int n,k,m; 10 vector<int> v[MAX_M]; 11 12 int main() 13 { 14 cin>>n>>k>>m; 15 int a; 16 for(int i=0;i<n;i++) 17 { 18 cin>>a; 19 v[a%m].push_back(a); 20 if(v[a%m].size()==k) 21 { 22 cout<<"Yes"<<endl; 23 for(int j=0;j<v[a%m].size();j++) 24 { 25 cout<<v[a%m][j]<<" "; 26 } 27 cout<<endl; 28 return 0; 29 } 30 } 31 cout<<"No"<<endl; 32 }