前缀和 。(2.22)

UMR与黑白熊

Time Limit: 1000 ms  Memory Limit: 65536 KiB

Problem Description

小埋今天得到了一个很神奇的数列,感觉自己萌萌哒。然而这其实是黑白熊的套路。小埋在碰见这个序列之后变成了这个样子:

3721

此时的你需要准确的回答黑白熊的问题,才能帮助小埋拜托控制,而不会让小埋 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)。就是利用前缀和。暴力的时候就是一重循环区间长度,一重循环区间头部,一重往下扫

猜你喜欢

转载自blog.csdn.net/beposit/article/details/79347254
今日推荐