同余(思维)
题意:输入 n m, 下一行输入 n 个数 ;问:在该序列中是否存在连续的子序列的和可以被 m 整除?
思路:计算前缀和,并且每个前缀和对 m 取余,记录结果。若存在这样一种序列,那么取余的结果必定出现第二次,也就是说,当前取余结果若出现过,那么在出现过的那个位置到现在这个位置的区间和为 m 的整数倍。
【 (d+m ) %k=d 】 ==【 d%k =d 】
撸代码:
#include<stdio.h>
#include<string.h>
int main()
{
int t;
scanf("%d",&t);
int n,m;
bool book[5010];
while(t--)
{
memset(book,0,sizeof(book));
scanf("%d%d",&n,&m);
int x;
int sum=0;
bool flag=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
sum+=x;
sum=sum%m;
if(book[sum]||sum==0)
flag=1;
else
book[sum]=1;
//printf("sum=%d\n",sum);
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}