列表

详情


MT19. K 的倍数

描述

序列中任意个连续的元素组成的子序列称为该序列的子串。
现在给你一个序列 P 和一个整数 K ,询问元素和是 K 的倍数的子串的最大长度。

比如序列 [1,2,3,4,5],给定的整数 K 为 5,其中满足条件的子串为 {5}、{2,3}、{1,2,3,4}、{1,2,3,4,5} ,

那么答案就为 5,因为最长的子串为 {1,2,3,4,5} ; 如果满足条件的子串不存在,就输出 0。

数据范围:

输入描述

第一行包含一个整数N, 1 ≤ 𝑁 ≤ 105

第二行包含 N 个整数𝑝𝑖,𝑝𝑖表示序列P第i个元素的值。0 ≤ 𝑝𝑖 ≤ 105。第三行包含一个整数K,1 ≤ 𝐾 ≤ 105

输出描述

输出一个整数ANS,表示答案。

示例1

输入:

5
1 2 3 4 5
5

输出:

5

示例2

输入:

6
3 1 2 7 7 7
4

输出:

5

原站题解

C++ 解法, 执行用时: 12ms, 内存消耗: 1292KB, 提交时间: 2020-08-29

#include <iostream>
 
using namespace std;
 
int main()
{
    long long n;
    scanf("%d", &n);
    long long p[n+1];
    p[0] = 0;
        for(int i=1 ; i<=n ; i++)
        {
            scanf("%lld", &p[i]);
            p[i] += p[i-1];
        }
    int k;
    scanf("%d", &k);
    for(int len=n ; len>0 ; len--)
    {
        for(int i=0 ; i<=n-len ; i++)
        {
            int j = i + len;
            if((p[j]-p[i]) % k == 0)
            {
                cout << len << endl;
                return 0;
            }
        }
    }
    cout << 0 << endl;
}

C++14 解法, 执行用时: 13ms, 内存消耗: 1608KB, 提交时间: 2020-07-28

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX_SIZE = 100005, INF = 0x3f3f3f3f;
  
//-----------------INPUT-----------------//
int n, k, nums[MAX_SIZE];
  
int rec[MAX_SIZE];
  
int solve() {
    int ans = 0, cur = 0;
    memset(rec, 0x3f, k * sizeof rec[0]);
    rec[0] = -1;
    for (int i = 0; i < n; ++i) {
        cur = (cur + nums[i]) % k;
        ans = max(ans, i - rec[cur]);
        rec[cur] = min(rec[cur], i);
    }
    return ans;
}
  
int main() {
    while (scanf("%d", &n) == 1) {
        for (int i = 0; i < n; ++i) scanf("%d", nums + i);
        scanf("%d", &k);
        printf("%d\n", solve());
    }
}

上一题