您的位置:首页 > 其它

light oj 1134

2016-09-10 20:14 246 查看
Description

You are given an array with N integers, and another integer M. You have to find the number of consecutive subsequences which are divisible by M.

For example, let N = 4, the array contains {2, 1, 4, 3} and M = 4.

The consecutive subsequences are {2}, {2 1}, {2 1 4}, {2 1 4 3}, {1}, {1 4}, {1 4 3}, {4}, {4 3} and {3}. Of these 10 'consecutive subsequences', only two of them adds up to a figure that is a multiple of 4 - {1 4 3} and {4}.

Input

Input starts with an integer T (≤ 10), denoting the number of test cases.

Each case contains two integers N (1 ≤ N ≤ 105) and M (1 ≤ M ≤ 105). The next line contains N space separated integers forming the array. Each of these integers will lie in the range [1,
105]
.

Output

For each case, print the case number and the total number of consecutive subsequences that are divisible by M.

Sample Input

2

4 4

2 1 4 3

6 3

1 2 3 4 5 6

Sample Output

Case 1: 2

Case 2: 11

#include<iostream>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include <algorithm>

using namespace std;

const int N = 100005;
const int inf = 0x3f3f3f3f;
typedef long long LL;

int main()
{
int t, n, m, i, k=1;
int a[N];
LL f[N];

scanf("%d",&t);
while(t--)
{
scanf("%d %d", &n, &m);
memset(f, 0, sizeof(f));
for(i = 0;i<n;i++)
{
scanf("%d", &a[i]);
a[i]=a[i]%m;
}
LL ans = 0;
LL sum = 0;
f[0]=1;
for(i=0;i<n;i++)
{
sum=(a[i]+sum)%m;

ans+=f[sum];

f[sum]++;
}
printf("Case %d: %lld\n", k++, ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: