最长连续子段和被某个整数整除(SOJ 2293)

SOJ 2293: The Longest SubSequence

题目意思很明白,找出能被给出的整数整除的最长的连续子段和,输出这个子段和的长度。算法思路很简单:对数组累计求和,然后利用模同余的思想。这里有个取模的trick注意一下,C++中一个负数$x$对一个正数$y$取模为负,例如$-9\%4=-1$.为了避免负余数,我们可以用$(x\%y+y)\%y$. 

代码:

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    int n, m;
    int i;
    int mod[10005];
    int temp;
    long long sum;
    int result;
    int id;
    while (scanf("%d%d", &n, &m) == 2)
    {
        memset(mod, -1, sizeof(mod));
        sum = 0;
        result = 0;
        mod[0] = 0;
        for (i = 1; i <= n; i++)
        {
            scanf("%d", &temp);
            sum = sum + temp;
            id=(sum%m + m) % m;
            if (mod[id] == -1)
                mod[id] = i;
            else
            {
                if (i - mod[id] > result)
                    result = i - mod[id];
            }
        }
        printf("%d\n", result);
    }
    return 0;
}
View Code

参考以下博文:

https://blog.csdn.net/lth404391139/article/details/39741341

posted on 2019-03-01 13:08  小叶子曰  阅读(279)  评论(0编辑  收藏  举报

导航