讲笑话-计数

如有错误,请留言提醒,不要坑到小朋友

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.


你可能感兴趣的:(我写的)