码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 5776

时间:2016-08-01 15:21:33      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5776

求是否有区间的和是m的倍数

 

预处理前缀和,一旦有两个数模m的值相同,说明中间一部分连续子列可以组成m的倍数。

证明:若 x % m = b 且 y % m = b,那么x可以写成x = a1 * m + b,y可以写成y = a2 * m + b,(y - x) % m = ((a2 - a1) * m) % m = 0

    假设1-n个数  sum【1-i】%m=sum【1-j】%m  所以sum【1-j】-sum【1-i】%m=0;

        所以存在区间的和是m的倍数

   

#include"iostream"
#include"cstring"
using namespace std;

const int N=100000;
int sum[N];
int ans[N];
int main(){

        int t,n,m;
        cin>>t;
        while(t--){
            cin>>n>>m;
            bool flag=false;
            memset(sum,0,sizeof(sum));
            memset(ans,0,sizeof(ans));
            ans[0]=1;
            for(int i=1;i<=n;i++){
                cin>>sum[i];
                sum[i]=(sum[i-1]+sum[i])%m;
                ans[sum[i]]++;
            }
            for(int i=0;i<=n;i++)
                if(ans[i]>1)
                    flag=true;
            if(flag)
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
        }
        return 0;

}

  

HDU 5776

标签:

原文地址:http://www.cnblogs.com/hutonm/p/5725869.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!