Given a series of n numbers a1, a2, ..., an, the partial sum of the numbers is defined as the sum of ai, ai+1, ..., aj.
You are supposed to calculate how many partial sums of a given series of numbers could be divided evenly by a given number m.
Input
There are multiple test, each contains 2 lines.
The first line is 2 positive integers n (n <= 10000 ) and m (m <= 5000).
The second line contains n non-negative integers a1, a2, ..., an. Numbers are separated by one or several spaces.
The input is ended by EOF.
Output
One test each line - the number of partial sums which could be divided by m.
Sample Input
5 4
1 2 3 4 5
6 7
9 8 7 6 5 4
Sample Output
2
3
题目大意:从n个数中选一些,他们的和可以被m整除,求有多少组这样的数。
sum[i...j]=sum[1....j]-sum[1....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
所以记录下从1...i的和存到sum数组中,若某个个sum[i]有K个,就有C(K,2)种结果
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
int a[10005];
int main()
{
while(cin>>n>>m)
{
int ans=0,sum=0,x;
memset(a,0,sizeof(a));
for(int i=0; i<n; i++)
{
cin>>x;
sum=(sum+x)%m;
if(sum==0)
ans++;
a[sum]++;
}
for(int i=0; i<m; i++)
if(a[i])
ans+=a[i]*(a[i]-1)/2;
cout<<ans<<endl;
}
}