题意:给我们一个长度为 n 的a数组,又给了我们他相应的元素a1,a2,a3,,,an,又给了我们一个数k,问a中是否存子序列数组b,b数组满足,长度大于等于2,并且,在b数组中的任意两个元素相加和为k的倍数,若存在输出最长的那个b的长度,否则输出-1 *思路:我们考虑什么样的两个数a、b相加会得出来是k的倍数
#include<iostream>#include<cmath>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<map>
using namespace std;voidfre(){freopen("A.txt","r",stdin),freopen("Ans.txt","w",stdout);}#define ll long long constint mxn =100005;
ll ar[mxn];
map<int,int> mp;intmain(){/* fre(); */int n, k;scanf("%d %d",&n,&k);for(int i =0; i < n; i ++)scanf("%lld",&ar[i]);if(n ==1){printf("-1\n");return0;}int flag_more =0;int flag_ban =0;for(int i =0; i < n; i ++){
ar[i]%= k;if(ar[i]% k ==0)
flag_more ++;if(k%2==0&& ar[i]== k/2)
flag_ban ++;}if(flag_more >=2|| flag_ban >=2){printf("%d\n",max(flag_more, flag_ban));return0;}for(int i =0; i < n; i ++){
mp[ar[i]]++;}
bool flag_2 =0;for(int i =0; i < n; i ++){
mp[ar[i]]--;if(mp[k - ar[i]]){
flag_2 =1;break;}}if(flag_2){printf("%d\n",2);return0;}printf("-1\n");return0;}