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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值