sum[i...j] = a[i]+a[i+1]+...+a[j] = sum[1...j]-sum[1...i-1],1 =< i <= j <= n
分两种情况:
1、i=1时,sum[1...j]%m==0,cnt++;
2、i>1时,sum[i...j]%m==0 <=> (sum[1...j]-sum[1...i-1])%m==0 <=> sum[1...j]%m==sum[1...i-1]%m (令= k != 0),cnt += C(k出现的次数,2)
-
//zoj1569 Partial Sums
-
//Accepted 1569 C ++ 00:00.05 448K
-
#include <stdio.h>
-
#include <string.h>
-
#define MAXN 10000
-
#define MAXM 5000
-
int n,m;
-
void solve()
-
{
-
int i,cnt=0,sum=0,a,b[MAXM];
-
memset(b,0,sizeof(b));
-
for (i=0; i<n; ++i) {
-
scanf ("%d",&a);
-
sum = (sum+a)%m;
-
if (sum==0) cnt++;
-
b[sum]++;
-
}
-
for (i=0; i<m; ++i)
-
if (b[i]) cnt += b[i]*(b[i]-1)/2;
-
printf ("%d/n",cnt);
-
}
-
int main()
-
{
-
while (scanf ("%d %d",&n,&m) != EOF)
-
solve();
-
return 0;
-
}