Magic Pen
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
一次偶然的机会,LYH得到了一支Magic Pen。
学期结束时,A老师交给LYH一个任务:把N个不及格同学的名单和成绩交给B老师。而这里面有好多人都是LYH的朋友,所以为了“救”他们,他决定用他的Magic Pen划去一部分同学的名字。可是,B老师已经知道了这N个同学的总成绩对M取余后的结果。为了不让B老师发现任何可疑的地方,LYH必须保证剩下的同学的总成绩对M取余后的结果等于N个同学的总成绩对M取余后的结果。聪明的你能告诉LYH最多能划去多少个同学的名字吗?
-
输入
-
有T组测试数据( T<=200)。
每组数据第一行输入两个整数N和M(0<N<=1000,0<M<10003);
第二行包含N个整数a1,a2,a3,···an(-100<=a1,a2,···an<=100),ai表示第i个同学的成绩。
(注意:Magic Pen只能使用一次且只能划去连续的名字,成绩可以是负数。)
输出
- 输出最多能划去多少个同学的名字。 样例输入
-
3 2 3 1 6 3 3 2 3 6 2 5 1 3
样例输出
-
1 2 0
来源
- hdu改编 上传者
#include <stdio.h>
#include <string.h>
const int maxn = 100000 + 5;
int dp[maxn];
int hs[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n, m;
scanf("%d%d", &n, &m);
memset(hs,-1,sizeof(hs));
for (int i = 1; i <= n; i++)
scanf("%d", &dp[i]);
hs[0] = 0;
int MAX = 0;
for (int i = 1; i <= n; i++) //遍历所有数值
{
dp[i] += dp[i-1];
dp[i] %= m;
if(dp[i] < 0 )
dp[i] = m + dp[i];
if(hs[dp[i]] != -1)
{
if(i - hs[dp[i]] > MAX)
MAX = i - hs[dp[i]];
}
else
{
hs[dp[i]] = i;
}
}
printf("%d\n", MAX);
}
return 0;
}