2018CHD-ACM新生赛(正式赛)C.绝望のRevue

Description
“Bonjour!”毒系宝可梦大师lwqqq扑上来了! BrotherZhi派出了杰尼龟! 毒系宝可梦大师lwqqq派出了slppp,slppp使用了麻麻电击! 嘶————— 杰尼龟倒下了!
GG!!!BrotherZhi再次输掉了对战,因为对手的slppp太强了!为了打败霸占键盘的slppp,BrotherZhi听 从了大木博士的建议,决定去抓一只闪光伊布!但是闪光伊布可不是这么容易就能出现的,必须先捕获k只 任意两对能力值之差能整除m的小伊布,闪光伊布才有可能出现。BrotherZhi的宝可梦盒中已有n只小伊 布,第i只小伊布的能力值为ai。聪明的你能告诉已经熬夜失了智的BrotherZhi闪光伊布有可能出现了吗?

Input

输入第一行为一个整数T(T ≤ 30),表示一共有T组测试数据。 对于每组测试数据: 第一行有三个整数n(1 ≤ n ≤ 105),k(1 ≤ k ≤ n),m(1 ≤ m ≤ 105),其中n表示已有小伊布数量。 第二行有n个整数,其中第i个整数ai(1 ≤ ai ≤ 109),表示第i只伊布的能力值。

Output
对于每组测试数据,输出“YES”表示闪光伊布可能出现。否则输出“NO”。


Sample Input
2

4 3 4

2 6 5 10

4 3 4

2 7 5 10

Sample Output
YES

NO

Hint
对于第一组样例,BrotherZhi的第1只,第2只和第4只小伊布满足两两能力值之差能被4整除。 对于第二组样例,任意3只都不满足。

思路:本题用到一个定理,若a与b之差能整除m,则a%m==b%m,故判断任意两数之差能否整除m,只需判断任意两数对m取余后是否相等即可。在输入时对每一个数取余后保存进数组,排序后进行统计,若余数相等的数字的个数达到k,则为YES,否则为NO。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #define M 1000005
 6 
 7 using namespace std;
 8 int a[M];
 9 int main()
10 {
11     int t;
12     cin >> t;
13     while (t--)
14     {
15         int n, k, m;
16         cin >> n >> k >> m;
17         for (int i = 0; i < n; i++)
18         {
19             cin >> a[i];
20             a[i] %= m;
21         }
22         sort(a, a + n);
23         int flag=a[0], num=1,q=0;//flag表示当前正在统计个数的余数,num表示该数的个数,q表示是否跳出循环
24 for (int i = 1; i < n; i++) 25 { 26 if (a[i] == a[i - 1]) num++; 27 else { 28 flag = a[i]; 29 num = 1; 30 } 31 if (num == k) //当个数达到k跳出循环,同时q=1 32 { 33 q = 1; 34 break; 35 } 36 } 37 if (q == 0) cout << "NO" << endl; 38 else cout << "YES" << endl; 39 } 40 return 0; 41 }

猜你喜欢

转载自www.cnblogs.com/harutomimori/p/10105713.html
今日推荐