hihocoder-1796-完美K倍子数组
#1796 : 完美K倍子数组
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
如果一个数组满足长度至少是2,并且其中任意两个不同的元素Ai和Aj (i ≠ j)其和Ai+Aj都是K的倍数,我们就称该数组是 完美K倍数组。
现在给定一个包含N个整数的数组A = [A1, A2, ... AN]以及一个整数K,请你找出A的最长的完美子数组B,输出B的长度。
如果这样的子数组不存在,输出-1。
输入
第一行包含两个整数N和K。
第二行包含N个整数A1, A2, ... AN。
1 ≤ N ≤ 100000
1 ≤ Ai, K ≤ 1000000000
输出
一个整数,表示答案。
-
样例输入
-
5 3 1 3 2 3 6
样例输出
-
3
题解:
对于K倍,需要同时关注K倍的和 K 倍 余K/2 的数。
还需要考虑: 不存在两者时,数组内,是否存在两个数字的和整除K。
#include <cstdio>
#include <iostream>
#include <set>
using namespace std;
const int MAXN = 100000 + 10;
int N, K;
int num[MAXN];
int find_array()
{
bool is_even;
if(K%2 == 0)
{
is_even = true;
}else{
is_even = false;
}
int k_full = 0, k_half = 0;
for(int i=0; i<N; ++i)
{
if(num[i]%K == 0)
{
++k_full;
}
if(is_even && num[i]%K==K/2)
{
++k_half;
}
}
int ans = 0;
if(k_half > k_full)
{
if(k_half == 1)
{
ans = 0;
}else{
ans = k_half;
}
}else{
ans = k_full;
}
return ans;
}
bool find_pair()
{
set<int> vis;
for(int i=0; i<N; ++i)
{
int remain = num[i]%K;
if(vis.count(K - remain)){
return true;
}
vis.insert(remain);
}
return false;
}
int main(){
int ans;
scanf("%d %d", &N, &K);
for(int i=0; i<N; ++i)
{
scanf("%d", &num[i]);
}
if(N <= 1)
{
printf("-1\n");
return 0;
}
ans = find_array();
if(ans < 2)
{
if(find_pair()){
ans = 2;
}else{
ans = -1;
}
}
printf("%d\n", ans);
return 0;
}