给定一个由正整数组成的集合S,找出一个最大的子集合S,使得S中任意两个数字的和都不能被K整除。
例如S=「10,10,12,19,22,24,25」,K=4。此时S最多只能取3个数,可能的取值为「10,12,25」或者「19,22,24」等。
输入为两行,第一行两个数字,分别表示集合S的元素数量N和K。第二行为N个数字,分别是S的各个元素值。
数据范围:
1 < N < 10^5
1 < K < 100
1 < S[i] < 10^9
输出为一个数字,集合S的最大长度。
4 3 1 7 2 4
3
a=list(map(int,input().split())) if len(a)<2: l=a k=int(input()) else: l=a[0] k=a[1] arr=list(map(int,input().split())) arr_1=[i%k for i in arr] count_n=0 for i in range(0,k): if i in arr_1: if i==0: count_n+=1 elif i ==k/2: count_n+=1 else: num_i=0 for j in arr_1: if j==i: num_i+=1 if k-i in arr_1: num_k_i=0 for p in arr_1: if p==k-i: num_k_i+=1 count_n+=max(num_i,num_k_i) arr_1.remove(k-i) else: count_n+=num_i arr_1.remove(i) print(count_n)
def long_set(num,k):
if not num:
return 0
if k==1 or len(num)==1:
return 1
dic = {}
for i in num:
tem = i%k
dic[tem] = dic.get(tem,0)+1
dp = [0 for _ in range(k)]
for i in list(dic.items()):
dp[i[0]] = i[1]
res = min(1,dp[0])
if k&1==1:
j = 1
while j <= k//2:
res += max(dp[j],dp[k-j])
j += 1
else:
m = 1
while m<k//2:
res += max(dp[m],dp[k-m])
m += 1
res += min(1,dp[m])
return res
if __name__=='__main__':
n,k = list(map(int,input().split()))
num = list(map(int,input().split()))
print(long_set(num,k))