题目描述
输入n和k两个整数,然后输入n个数,组成一个序列,请你帮忙找出在这个序列中共有多少组连续的数的和是k
输入
第一行2个整数 n和k,中间有一个空格间隔
第二行输入n个整数,每个数中间有一个空格
输出
一行一个整数
样例输入 Copy
5 8 1 3 2 2 6
样例输出 Copy
2
提示
30% 1<=n<=1000; 序列中第i个数的值a[i]满足0<=a[i]<=1e5; 0<=k<=1e9
50% 1<=n<=10000; 序列中第i个数的值a[i]满足0<=a[i]<=1e9; 0<=k<=1e9
100% 1<=n<=100000; 序列中第i个数的值a[i]满足0<=a[i]<=1e9; 0<=k<=1e9
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;//因为元素范围很大,所以定义一个long long类型
ll a[100005],p[100005];
map<int,int> mp;
int main()
{
mp[0]=1;
ll n,k,i,j,s=0;
cin>>n>>k;
for(i=1;i<=n;i++)
{
cin>>a[i];
p[i]=p[i-1]+a[i];//前缀和
mp[p[i]]++;//将当前前缀和存入map当中
}
for(i=1;i<=n;i++)//相当于遍历一遍数组p
if(mp[p[i]-k]!=0)//如果前缀和-k的结果存在,就让s开始计数
s+=mp[p[i]-k];
cout<<s;
return 0;
}