UMR与黑白熊
Time Limit: 1000 ms
Memory Limit: 65536 KiB
Problem Description
小埋今天得到了一个很神奇的数列,感觉自己萌萌哒。然而这其实是黑白熊的套路。小埋在碰见这个序列之后变成了这个样子:
此时的你需要准确的回答黑白熊的问题,才能帮助小埋拜托控制,而不会让小埋 over 掉。
问题其实也很简单,那就是问你在这个序列中(序列中有 n 个数,标号为 1 到 n),存不存在一个区间 [L, R] (1 <= L <= R <= n) 使得这个区间中所有的数的和为 m 的倍数。
Input
输入数据有多组(数据组数不超过 50),到 EOF 结束。
每组输入包括:
- 第一行为以空格分开的 n (1 <= n <= 10000) 和 m (1 <= m <= 20000),代表的意义如题目中所说。
- 第二行为 n 个数,表示题目中的序列(每个数不超过 1000)。
Output
如果存在题目中描述的区间则输出“qwq”,否则输出“QWQ”。
Sample Input
3 2 1 2 3
Sample Output
qwq
Hint
上面的序列可以分成 [1]、[2]、[3]、[1,2]、[2,3]、[1,2,3]。
对应的和分别是 1、2、3、3、5、6。2 和 6 都是 2 的倍数。
#include <stdio.h> int MAXN=1e4+7; int a[10007]; int n,m; int main() { int i,j; while(~scanf("%d%d",&n,&m)) { for(i=1; i<=n; ++i) { scanf("%d",&a[i]); a[i]+=a[i-1]; } int flag=0; for(i=1; i<=n; ++i) { for(j=0; j<i; ++j) { if((a[i]-a[j])%m==0) { puts("qwq"); flag=1; break; } } if(flag)break; } if(!flag)puts("QWQ"); } return 0; }有一种优化可以降到 O(n*(n-1)/2)。就是利用前缀和。暴力的时候就是一重循环区间长度,一重循环区间头部,一重往下扫