[关闭]
@Rarfaeal 2019-11-09T08:47:07.000000Z 字数 3521 阅读 304

由于有 的贡献在这里 , 所以这个东西不能直接拆成 , 不然这题就太水了。

我们设 , 然后考虑一个有用的贡献定义为 。 所以说询问离线以后 , 每当一个 变大 , 那么就会对 有影响 , 然后我们要将 的值改变 , 这个东西总共就是 的 , 那么运用线段树就可以做到

考虑提前筛 ? 暴力 即可。

查询的时候的复杂度就是

  1. Uses math;
  2. Const
  3. total=12;
  4. var
  5. ans,sigma,mobius:array[-1..total] of longint;
  6. input:array[-1..total,-1..6] of longint;
  7. tree:array[-1..total << 4] of longint;
  8. i,j,k,n,m,a,id,anss,test:longint;
  9. procedure Swap(var a,b:longint);var t:longint;begin t:=a; a:=b; b:=t; end;
  10. procedure Sort(l,r,a,b,c,d:longint);
  11. var i,j,s:longint;
  12. begin
  13. i:=l; j:=r; s:=input[(l+r) >> 1,a];
  14. repeat
  15. while input[i,a]<s do inc(i);
  16. while input[j,a]>s do dec(j);
  17. if i<=j then
  18. begin
  19. Swap(input[i,a],input[j,a]); Swap(input[i,b],input[j,b]);
  20. Swap(input[i,c],input[j,c]); Swap(input[i,d],input[j,d]);
  21. inc(i); dec(j);
  22. end;
  23. until i>=j;
  24. if i<r then Sort(i,r,a,b,c,d); if j>l then Sort(l,j,a,b,c,d);
  25. end;
  26. procedure Insert(l,r,k,key,add:longint);
  27. var mid:longint;
  28. begin
  29. if l=r then begin inc(tree[k],add); exit; end; mid:=(l+r) >> 1;
  30. if key<=mid then Insert(l,mid,k << 1,key,add) else Insert(mid+1,r,k << 1+1,key,add);
  31. tree[k]:=tree[k << 1]+tree[k << 1+1];
  32. end;
  33. function Query(l,r,k,x,y:longint):longint;
  34. var mid:longint;
  35. begin
  36. if (l>=x)and(y>=r) then exit(tree[k]); mid:=(l+r) >> 1; Query:=0;
  37. if x<=mid then inc(Query,Query(l,mid,k << 1,x,y));
  38. if y>mid then inc(Query,Query(mid+1,r,k << 1+1,x,y));
  39. end;
  40. begin
  41. read(test);
  42. for i:=1 to test do begin read(input[i,1],input[i,2],input[i,3]); input[i,4]:=i; end;
  43. Sort(1,test,3,1,2,4); mobius[1]:=1; a:=0;
  44. for i:=1 to total do for j:=1 to total div i do inc(sigma[i*j],i);
  45. for i:=1 to total do for j:=2 to total div i do dec(mobius[i*j],mobius[i]);
  46. for i:=1 to total do begin input[i,5]:=i; input[i,6]:=sigma[i]; end;
  47. Sort(1,test,6,5,0,0);
  48. for k:=1 to test do
  49. begin
  50. while a<input[k,3] do begin inc(a); id:=input[a,5];
  51. for i:=2 to total div id do Insert(1,total,1,i*id,sigma[id]*mobius[i]); end;
  52. anss:=0; i:=1; j:=0; n:=input[k,1]; m:=input[k,2];
  53. repeat
  54. j:=min(n div (n div i),m div (m div i));
  55. inc(anss,(n div i)*(m div i)*(Query(1,n,1,i-1,j))); i:=j+1;
  56. until i>min(n,m);
  57. ans[input[k,4]]:=anss;
  58. end;
  59. for i:=1 to test do writeln(ans[i]);
  60. end.
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注