hihocoder-1796-完美K倍子数组

Posted zhang-yd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hihocoder-1796-完美K倍子数组相关的知识,希望对你有一定的参考价值。

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
"); 
        return 0; 
    }
    ans = find_array();  
    if(ans < 2)
    {
        if(find_pair()){
            ans = 2; 
        }else{
            ans = -1; 
        } 
    }
    printf("%d
",  ans); 

    return 0; 
} 

  

 

以上是关于hihocoder-1796-完美K倍子数组的主要内容,如果未能解决你的问题,请参考以下文章

大数相乘

Deltix Round, Summer 2021 (open for everyone, rated, Div. 1 + Div. 2) D. Take a Guess (交互,位运算性质)(代码片

如何将字节数组附加到Go中的字节片[重复]

在并行位片代码中实现快速计数器

leetcode 698 集合k划分

矩阵权(Matrix weighted)Bezier三角(曲面)片