[关闭]
@Rarfaeal 2019-11-02T02:59:41.000000Z 字数 3191 阅读 432
  1. var
  2. i,n,m,k,l,r:longint;
  3. sv:text;
  4. begin
  5. assign(sv,'C:\Users\Administrator\Desktop\Data\Data1.in'); rewrite(sv);
  6. randomize;
  7. n:=100; m:=100; k:=11; writeln(sv,n,' ',m,' ',k);
  8. for i:=1 to n do write(sv,random(n)+1,' '); writeln(sv);
  9. for i:=1 to m do
  10. begin
  11. r:=random(n)+1; l:=random(r)+1;
  12. writeln(sv,l,' ',r);
  13. end;
  14. close(sv);
  15. end.
  16. ---
  17. Const
  18. total=1000;
  19. var
  20. num:array[-1..total] of longint;
  21. l,r,i,j,p,k,n,m,ans:longint;
  22. begin
  23. read(n,m,p);
  24. for i:=1 to n do read(num[i]);
  25. for k:=1 to m do
  26. begin
  27. read(l,r); ans:=0;
  28. for i:=l to r do for j:=l to r do if num[i] mod num[j]=p then inc(ans);
  29. writeln(ans);
  30. end;
  31. end.
  1. Uses math;
  2. Const
  3. total=10000 << 1+10;
  4. block_sum=total*trunc(sqrt(total >> 1))+10;
  5. var
  6. pom,next,reach:array[-1..block_sum] of longint;
  7. num,ans,bucket:array[-1..total] of longint;
  8. ele:array[1..6,-1..total] of longint;
  9. cnt:array[-1..total] of longint;
  10. n,m,k,i,j,l,r,tot,maxn,node_num,block_num:longint;
  11. procedure Swap(var x,y:longint);var t:longint; begin t:=x; x:=y; y:=t; end;
  12. function Locate(node:longint):longint;
  13. begin
  14. if node mod node_num=0 then exit(node div node_num);
  15. exit(node div node_num+1);
  16. end;
  17. procedure Link(l,r,id:longint);
  18. begin
  19. inc(tot); reach[tot]:=r; pom[tot]:=id;
  20. next[tot]:=cnt[l]; cnt[l]:=tot;
  21. end;
  22. procedure Sort(l,r,a,b,c,d:longint);
  23. var i,j,s1,s2:longint;
  24. begin
  25. i:=l; j:=r; s1:=ele[a,(l+r) >> 1]; s2:=ele[b,(l+r) >> 1];
  26. repeat
  27. while (ele[a,i]<s1)or((ele[a,i]=s1)and(ele[b,i]<s2)) do inc(i);
  28. while (ele[a,j]>s1)or((ele[a,j]=s1)and(ele[b,j]>s2)) do dec(j);
  29. if i<=j then
  30. begin
  31. Swap(ele[a,i],ele[a,j]); Swap(ele[b,i],ele[b,j]);
  32. Swap(ele[c,i],ele[c,j]); Swap(ele[d,i],ele[d,j]); inc(i); dec(j);
  33. end;
  34. until i>=j; if i<r then Sort(i,r,a,b,c,d); if j>l then Sort(l,j,a,b,c,d);
  35. end;
  36. procedure Tansfer(l,r,x,id,mode:longint);
  37. var a,b:longint;
  38. begin
  39. if mode=1 then begin a:=1; b:=-1; end else begin a:=-1; b:=1; end;
  40. Link(r,x,a*id); Link(l-1,x,b*id);
  41. end;
  42. procedure Moheader;
  43. var i,j:longint;
  44. begin
  45. filldword(cnt,sizeof(cnt) >> 2,maxlongint << 1+1);
  46. read(n,m,k); node_num:=trunc(sqrt(n)); block_num:=Locate(n);
  47. for i:=1 to n do begin read(num[i]); maxn:=max(maxn,num[i]); end;
  48. for i:=1 to m do begin read(ele[1,i],ele[2,i]); ele[4,i]:=Locate(ele[1,i]); ele[3,i]:=i; end;
  49. Sort(1,m,4,2,1,3); l:=1; r:=0;
  50. for i:=1 to m do
  51. begin
  52. while r<ele[2,i] do begin inc(r); Tansfer(l,r-1,num[r],ele[3,i],1); end;
  53. while r>ele[2,i] do begin Tansfer(l,r-1,num[r],ele[3,i],-1); dec(r); end;
  54. while l<ele[1,i] do begin Tansfer(l+1,r,num[l],ele[3,i],-1); inc(l); end;
  55. while l>ele[1,i] do begin dec(l); Tansfer(l+1,r,num[l],ele[3,i],1); end;
  56. end;
  57. end;
  58. procedure Cfunction_make;
  59. var i,j,t,anss,zero:longint;
  60. begin
  61. for i:=1 to maxn do bucket[i]:=0; zero:=0;
  62. for i:=1 to n do
  63. begin
  64. if num[i]=k then inc(zero);
  65. if num[i]>k << 1 then
  66. begin
  67. t:=num[i]-k;
  68. for j:=2 to trunc(sqrt(t)) do begin if t mod j<>0 then continue; inc(bucket[j]); inc(bucket[t div j]); end;
  69. if sqrt(t)=trunc(sqrt(t)) then dec(bucket[trunc(sqrt(t))]); inc(bucket[t]);
  70. end;
  71. j:=cnt[i];
  72. while j<>-1 do
  73. begin
  74. if reach[j]>k then inc(ans[abs(pom[j])],(pom[j] div abs(pom[j]))*(bucket[reach[j]]+zero));
  75. j:=next[j];
  76. end;
  77. end;
  78. end;
  79. procedure Dfunction_make;
  80. var i,j,t:longint;
  81. begin
  82. for i:=1 to maxn do bucket[i]:=0;
  83. for i:=1 to n do
  84. begin
  85. if num[i]>k then
  86. begin
  87. t:=num[i];
  88. for j:=0 to trunc(maxn/t+1) do begin if t*j+k>maxn then break; inc(bucket[t*j+k]); end;
  89. end;
  90. j:=cnt[i];
  91. while j<>-1 do
  92. begin
  93. inc(ans[abs(pom[j])],(pom[j] div abs(pom[j]))*(bucket[reach[j]]));
  94. j:=next[j];
  95. end;
  96. end;
  97. end;
  98. begin
  99. Moheader;
  100. Cfunction_make;
  101. Dfunction_make;
  102. for i:=1 to m do begin inc(ans[ele[3,i]],ans[ele[3,i-1]]); end;
  103. for i:=1 to m do writeln(ans[i]);
  104. end.
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注