sum (bestcoder)

sum

Accepts: 640
Submissions: 1744
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 131072/131072 K (Java/Others)
问题描述
给定一个数列,求是否存在连续子列和为m的倍数,存在输出YES,否则输出NO
输入描述
输入文件的第一行有一个正整数T(1≤T≤101leq T leq 101T10),表示数据组数。

接下去有T组数据,每组数据的第一行有两个正整数n,m (1≤n≤100000 1leq nleq 1000001n100000 ,1≤m≤5000 1leq mleq5000 1m5000).

第二行有n个正整数x (1≤x≤1001leq xleq 1001x100)表示这个数列。
输出描述
输出T行,每行一个YES或NO。
输入样例
2
3 3
1 2 3
5 7
6 6 6 6 6
输出样例
YES
NO
【分析】不知道为什么这么做可以,可能是结论吧,这是别人的AC代码。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <time.h>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#define inf 0x3f3f3f3f
#define mod 1000000007
typedef long long ll;
using namespace std;
const int N=5000+5;
bool flag[N];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m;
        scanf("%d%d",&n,&m);
        memset(flag,0,sizeof(flag));
        flag[0]=1;
        int s=0,x;
        bool ans=0;
        for(int i=1;i<=n;++i){
            scanf("%d",&x);
            s=(s+x)%m;
            if(flag[s])ans=1;
            flag[s]=1;
        }
        if(ans)puts("YES");
        else puts("NO");
    }
}
View Code
原文地址:https://www.cnblogs.com/jianrenfang/p/5723030.html