乘法师
首先,仔细读题,题意说“非负整数”,因此,数列中会出现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.