招聘网站建设人员条件东莞常平中转场
多多的求和计算
 多多路上从左到右有N棵树(编号1~N),其中第i个颗树有和谐值Ai。
 多多鸡认为,如果一段连续的树,它们的和谐值之和可以被M整除,那么这个区间整体看起来就是和谐的。
 现在多多鸡想请你帮忙计算一下,满足和谐条件的区间的数量。
 时间限制:C/C++ 1秒,其他语言2秒
 空间限制:C/C++ 256M,其他语言512M
 输入描述:
 第一行,有2个整数N和M,表示树的数量以及计算和谐值的参数。
 ( 1 <= N <= 100,000, 1 <= M <= 100 )
 第二行,有N个整数Ai, 分别表示第i个颗树的和谐值。
 ( 0 <= Ai <= 1,000,000,000 )
 输出描述:
 共1行,每行1个整数,表示满足整体是和谐的区间的数量。
 示例1
 输入例子:
 5 2
 1 2 3 4 5
 输出例子:
 6
 例子说明:
 长度为1: [2], [4]
 长度为2: 无
 长度为3: [1,2,3], [3,4,5]
 长度为4: [1,2,3,4], [2,3,4,5]
 长度为5: 无
 共6个区间的和谐值之和可以被2整除。
题解
前缀和取模计数,后面的前缀和减去前面的前缀和得到这个区间的和。
AC代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
int n,m;
int arr[maxn];
int sum[105];
int main() 
{cin>>n>>m;for(int i=0;i<n;i++){cin>>arr[i];arr[i] %= m;}memset(sum,0,sizeof(sum));sum[0] = 1;int total = 0;ll res = 0;for(int i=0;i<n;i++){total += arr[i];total %= m;for(int j=0;j<=m;j++){if((total+m-j)%m==0){res += (ll)sum[j];}}sum[total] += 1;}cout<<res<<endl;return 0;
}
