哈理工第八届校团队赛D所以我也想玩这个序列游戏

题意:

Description

今天dxy休息,他想出了一个序列游戏,具体描述如下:你有一个长度为n的正整数序列和一个正整数m,问其中是否存在一个非空子区间使得这个子区间的区间和是m的倍数。

Input

多组数据,读入到文件结尾对于每一组数据第一行:两个数n,m第二行:n个正整数,表示题目中的序列n<=106,m<=2000,0<a[i]<=109

Output

对于每组数据输出一行:若存在所描述的区间,则输出YES,否则输出NO

Sample Input

5 3

1 2 3 4 5

5 100

1 2 3 4 5

Sample Output

YES

NO

思路:

​ 这道题主要利用了抽屉原理,长度为n的一个数组,若n大于等于m,则一定存在一个子区间的和是m的倍数。当n < m时,由于m小于2000,直接暴力求解即可

代码:

#include <stdio.h>
#include <string.h>
#define ll long long
int a[1000005];
ll sum[1000005];
int main () {
    int n, m;
    while(scanf("%d%d", &n, &m) == 2) {
        memset(sum, 0, sizeof(sum));
        for (int i = 1; i <= n; i++) {
            scanf("%d", &a[i]);
            sum[i] = sum[i - 1] + a[i];
        }
        if (n >= m) {
            printf("YES\n");
            continue;
        }
        int flag = 0;
        for (int len = 1; len <= n; len++) {
            for (int i = 1; i + len - 1 <= n; i++) {
                if ((sum[i + len - 1] - sum[i - 1]) % m == 0) {
                    flag = 1;
                    break;
                }
            }
            if(flag) {
                break;
            }
        }
        if(flag) {
            printf("YES\n");
        } else {
            printf("NO\n");
        }
    }
    return 0;
}

转载请注明出处!!!

如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢

猜你喜欢

转载自blog.csdn.net/Ivan_zcy/article/details/84945576