如有错误,请留言提醒,不要坑到小朋友
Description
农民M特别喜欢讲笑话,有冷笑话和热笑话,比如:一只白猫掉到了水里,一只黑猫救了他,请问白猫上岸讲的第一句话是什么?答案当然是:“喵”。
农民M为他的朋友MONKEY准备了N个笑话要讲,这些笑话有冷热之分,并且农民M有个习惯,每次都是从这N个笑话中取连续的几个笑话讲给别人听(可以从中间的某一段开始取),MONKEY每听一个冷笑话就冷一下,听一个热笑话就热一下,为了使观众听完后不冷不热,农民M必须使得每次选取的冷热笑话均等。请问农民M有多少种准备笑话的方案。
Input
第一行为N,表示笑话的个数
第二行为N个用空格隔开的1和-1序列,其中1代表冷笑话,-1代表热笑话。
Output
总方案数MOD 999999的值。
Sample Input
9
-1 1 -1 -1 -1 1 1 -1 -1
Sample Output
8
Hint
样例数据说明:
农民M可以从第一个讲到第二个,也可以从第二个讲到第七个,还可从第六个讲到最后一个,……,总共有8种情况。
数据范围
100% N<=1000000
这题我们可以看出区间和为0就是一种方案
所以我们可以先求出前缀和,两点前缀和相同,则区间和为0
因为要求方案,所以我们可以记录一下,每一个前缀和出现了多少次
最后用(前缀和出现次数*(前缀和出现次数-1))的和就是答案
var
ans,b,c,d,n,i,k:longint;
bi,ai,ci:array[-1000000..1000000]of longint;
begin
readln(n);
ci[0]:=1;
for i:=1 to n do
begin
read(ai[i]);
bi[i]:=ai[i]+bi[i-1];
ci[bi[i]]:=ci[bi[i]]+1;
end;
for i:=-n to n do
if ci[i]>0 then
ans:=ans+(ci[i]*(ci[i]-1)) div 2;
ans:=ans mod 999999;
writeln(ans);
readln;
end.