乘法师
首先,仔细读题,题意说“非负整数”,因此,数列中会出现0。
所以,在求积的时候应以0为分隔,每一段求解再加起来。
注意 v等于0时,要特判。
var q,v,i,cnt,l,r,t:longint;
ans,s,n:int64;
a,p:array[0..100010] of longint;
begin
readln(q);
while q>0 do begin
fillchar(a,sizeof(a),0); ans:=0;
fillchar(p,sizeof(p),0); cnt:=0;
readln(n,v);
for i:=1 to n do begin
read(a[i]);
if a[i]=0 then begin inc(cnt); p[cnt]:=i; end;
end; readln;
if v=0 then begin writeln((n+1)*n div 2); dec(q); continue; end;
p[cnt+1]:=n+1; t:=0;
while t<=cnt do begin
inc(t);
l:=p[t-1]+1; r:=l; s:=1;
while l<=p[t]-1 do begin
while (r<=p[t])and(s<v) do begin s:=s*a[r]; inc(r); end;
if r>p[t] then break;
ans:=ans+p[t]-r+1;
s:=s div a[l];
inc(l);
end;
end;
writeln(ans);
dec(q);
end;
end. 
京公网安备 11010502036488号