您的位置:首页 > 其它

HDU 5776 BestCoder Round #85 sum (数学)

2016-07-31 11:45 477 查看

sum

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)

Total Submission(s): 557    Accepted Submission(s): 269


[align=left]Problem Description[/align]
Given a sequence, you're asked whether there exists a consecutive subsequence whose sum is divisible by m. output YES, otherwise output NO

[align=left]Input[/align]
The first line of the input has an integer T (1≤T≤10),
which represents the number of test cases.

For each test case, there are two lines:

1.The first line contains two positive integers n, m (1≤n≤100000,
1≤m≤5000).

2.The second line contains n positive integers x (1≤x≤100)
according to the sequence.

[align=left]Output[/align]
Output T lines, each line print a YES or NO.

[align=left]Sample Input[/align]

2
3 3
1 2 3
5 7
6 6 6 6 6

[align=left]Sample Output[/align]

YES
NO

[align=left]Source[/align]
BestCoder Round #85

[align=left]Recommend[/align]
wange2014   |   We have carefully selected several similar problems for you:  5780 5779 5778 5777 5775 

题解:预处理前缀和,一旦有两个数模m的值相同,说明中间一部分连续子列可以组成m的倍数。另外,利用抽屉原理,我们可以得到,一旦n大于等于m,答案一定是YES 。复杂度 O(n) 。

AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[100010];
bool vis[100010];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(vis,0,sizeof(vis));
int sum=0;
vis[0]=1;
bool flag=0;
for(int i=1;i <= n;i++)
{
scanf("%d",&a[i]);
sum=(sum+a[i])%m;
if(vis[sum])
{
flag=1;
}
//如果有两个余数相同,那这相加的数中一定有可模 m 的
vis[sum] = 1;
}
puts(flag ?"YES" : "NO");

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: