果断同余……
D[j]-D[i] mod k =0
D[j]=D[i]
求有多少相等数对,用队列O(n)
Program P3844; const maxn=50000; maxd=1000000; var ans,t,f,n,i,j:longint; d:array[0..maxn] of longint; procedure qsort(l,r:longint); var i,j,m,p:longint; begin i:=l;j:=r; m:=d[(l+r) shr 1]; repeat while d[i]<m do inc(i); while d[j]>m do dec(j); if i<=j then begin p:=d[i]; d[i]:=d[j]; d[j]:=p; inc(i);dec(j); end; until i>j; if l<j then qsort(l,j); if i<r then qsort(i,r); end; begin read(t); d[0]:=0; while (t>0) do begin read(f,n); for i:=1 to n do begin read(d[i]); d[i]:=(d[i]+d[i-1]) mod f; end; qsort(1,n); ans:=0; i:=0;j:=0; while (i<=n) do begin while (d[i]=d[j]) and (j<n) do inc(j); if d[i]<>d[j] then dec(j); inc(ans,((j-i+1)*(j-i)) shr 1); i:=j+1; inc(j); end; writeln(ans); dec(t); end; end.