乘法师

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