Codeforces 876B Divisiblity of Differences:数学【任意两数之差为k的倍数】

题目链接: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 }
原文地址:https://www.cnblogs.com/Leohh/p/7679009.html