给出n个数,求其中连续和能被m整除的个数。
普通做法,求出sum数列,然后两层循环会超时
考虑 1 2 3 4 5 中求4的情况
(1+2)%4=3
(1 +2 +3 +4+5)%4= 3; 3 出现了两次,
故 出现次数为 C(2,2)+1(完全整除的情况)
推广到一般形式:C(i出现的次数,2)+n(完全整除的情况)
代码
#include <stdio.h>
#include <string.h>
int vis[5001];
int main()
{
int n,m;
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(vis,0,sizeof(vis));
int ans=0,sum=0;
for(int i=0;i<n;i++)
{
int a;
scanf("%d",&a);
sum+=a;
sum%=m;
if(sum==0) ans++;
vis[sum]++;
}
for(int i=0;i<m;i++)
{
ans+=(vis[i])*(vis[i]-1)/2;
}
printf("%d\n",ans);
}
return 0;
}