题意:
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;
}
如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢