首先说明long long把我害惨了,因为数据没看好数据类型,用了int结果错了,我以为是我方法的问题,最后吧数据类型改成long long就对了,所以大家写的时候要注意使用的数据类型。
题目描述
给定一个长度为 N 的数列,A1,A2,⋯AN,如果其中一段连续的子序列Ai,Ai+1,⋯Aj(i≤j) 之和是 K 的倍数,我们就称这个区间 [i,j]是 K倍区间。
你能求出数列中总共有多少个 K倍区间吗?
输入格式
第一行包含两个整数 N和 K(1≤N,K≤1^5)。
以下 N 行每行包含一个整数 (1≤Ai≤10^5)。
输出格式
输出一个整数,代表 K 倍区间的数目。
输入输出样例
输入 #1
5 2 1 2 3 4 5
输出 #1
6
#include<bits/stdc++.h>
#include <algorithm>
using namespace std;
long long a[100005];
long long b[100005];
int main()
{
long long n,k;
cin>>n>>k;
long long cnt=0;
for(long long i=1;i<=n;i++)//计算数组a[i]的前缀和得到前缀和之后就是方便计算数组区间[i,j]的值
{
cin>>a[i];
a[i]=a[i]+a[i-1];
}
for(long long i=0;i<=n;i++)//然后每次通过计算a[j]-a[i]得到数组中区间[i,j]的和是否等于k的倍数
{
b[a[i]%k]++;//可以转化为a[j]%k==a[i]%k是否成立,然后就是计算a[i]%k的相等值的个数,进行两两匹配
}
for(long long i=0;i<k;i++)
{
cnt+=b[i]*(b[i]-1)/2;
}
cout<<cnt;
return 0;
}