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 }