題目連結: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 }