首页 > 其他 > 详细

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

时间:2019-03-01 13:54:26      阅读:277      评论:0      收藏:0      [点我收藏+]

SOJ 2293: http://acm.scu.edu.cn/soj/problem.action?id=2293

题目意思很明白,找出能被给出的整数整除的最长的连续子段和,输出这个子段和的长度。算法思路很简单:对数组累计求和,然后利用模同余的思想。这里有个取模的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

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

原文:https://www.cnblogs.com/ClearMoonlight/p/10455821.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!