[关闭]
@Rarfaeal 2019-11-28T10:51:25.000000Z 字数 3856 阅读 406
  1. Uses math;
  2. Const
  3. total=5000000;
  4. hash_sum=11451411;
  5. modn=maxlongint; // The bigest num
  6. var
  7. tim,gypsy,hudim:array[-1..trunc(sqrt(modn))*2] of longint;
  8. prime,judge,index,sigma:array[-1..total] of longint;
  9. cnt,next,value:array[-1..hash_sum] of longint;
  10. i,tot,pos,tail,square:longint;
  11. l,r,t,n,k,q,ans,val:int64;
  12. procedure Euler(n:longint);
  13. var i,j:longint;
  14. begin
  15. tail:=0; judge[1]:=1; prime[1]:=1; sigma[1]:=1;
  16. for i:=2 to n do
  17. begin
  18. if judge[i]=0 then begin inc(tail); sigma[i]:=4; index[i]:=1; prime[tail]:=i; end;
  19. for j:=1 to tail do
  20. begin
  21. if i*prime[j]>n then break; judge[i*prime[j]]:=1;
  22. if i mod prime[j]=0 then begin index[i*prime[j]]:=index[i]+1;
  23. sigma[i*prime[j]]:=sigma[i] div (3*index[i]+1)*(3*index[i*prime[j]]+1); break; end;
  24. index[i*prime[j]]:=1; sigma[i*prime[j]]:=sigma[i]*4;
  25. end;
  26. end;
  27. judge[1]:=0; index[1]:=1; prime[tail+1]:=total;
  28. for i:=2 to total do begin judge[i]:=judge[i-1]+abs(judge[i]-1); index[i]:=index[i-1]+sigma[i]; end;
  29. end;
  30. procedure Link(val:int64);
  31. begin
  32. inc(tot); value[tot]:=val;
  33. next[tot]:=cnt[val mod hash_sum]; cnt[val mod hash_sum]:=tot;
  34. end;
  35. function Query(val:int64):longint;
  36. var i:longint;
  37. begin
  38. i:=cnt[val mod hash_sum]; Query:=0;
  39. while i<>-1 do begin if value[i]=val then exit(i); i:=next[i]; end;
  40. end;
  41. procedure GSieve;
  42. var i,j:longint;
  43. begin
  44. l:=1; tot:=0;
  45. while l<=n do
  46. begin
  47. Link(n div l); gypsy[tot]:=n div l;
  48. tim[tot]:=0; l:=n div (n div l)+1;
  49. end;
  50. for i:=1 to tail do for j:=1 to tot do
  51. if sqr(prime[i])<value[j] then
  52. begin
  53. val:=Query(value[j] div prime[i]);
  54. dec(gypsy[j],gypsy[val]-(i-1-tim[val])); tim[j]:=i;
  55. end else break;
  56. end;
  57. procedure HSieve;
  58. var i,j:longint;
  59. begin
  60. for i:=tail downto 1 do for j:=1 to tot do
  61. if sqr(prime[i])<value[j] then
  62. begin
  63. if value[j]<prime[i+1] then hudim[j]:=1 else
  64. if value[j]<sqr(prime[i+1]) then
  65. hudim[j]:=(judge[min(total-1,value[j])]-judge[prime[i+1]-1]) << 2+1;
  66. k:=prime[i]; t:=1;
  67. while k<=value[j] do
  68. begin
  69. q:=value[j] div k;
  70. if q<prime[i+1] then val:=1 else
  71. if q<sqr(prime[i+1]) then
  72. val:=(judge[min(total-1,q)]-judge[prime[i+1]-1]) << 2+1 else val:=hudim[Query(q)];
  73. inc(hudim[j],val*(t << 1+t+1));
  74. inc(t); k:=k*prime[i];
  75. end;
  76. end else break;
  77. end;
  78. begin
  79. read(n); Euler(total); square:=trunc(sqrt(n));
  80. if n<=total then begin writeln(index[n]); halt; end;
  81. GSieve; HSieve; l:=1; r:=0;
  82. repeat
  83. val:=Query(n div l); r:=min(total-1,n div (n div l));
  84. if (n div l<total) then t:=1 else t:=gypsy[val]-(tail-tim[val]);
  85. inc(ans,(index[r]-index[l-1])*(t-1) << 2);
  86. until l>=total-1;
  87. writeln(ans+hudim[1]);
  88. end.
  89. // judge SF
  90. // tail m
  91. // total n
  92. // gypsy g
  93. // hudim f
  94. // tot cnt
  95. // cnt head
  96. // val v
  97. // value val
  98. // t c
  99. // k pr
  100. // q k
  1. Uses math;
  2. Const
  3. total=99;
  4. modn=maxlongint;
  5. var
  6. prime,judge,index,sigma:array[-1..total] of longint;
  7. i,pos,tail,square:longint;
  8. n,ans:int64;
  9. procedure Swap(var a,b:longint);var t:longint; begin t:=a; a:=b; b:=t; end;
  10. procedure Euler(n:longint);
  11. var i,j:longint;
  12. begin
  13. tail:=0; judge[1]:=1; prime[1]:=1; sigma[1]:=1;
  14. for i:=2 to n do
  15. begin
  16. if judge[i]=0 then begin inc(tail); sigma[i]:=4; index[i]:=1; prime[tail]:=i; end;
  17. for j:=1 to tail do
  18. begin
  19. if i*prime[j]>n then break; judge[i*prime[j]]:=1;
  20. if i mod prime[j]=0 then begin index[i*prime[j]]:=index[i]+1;
  21. sigma[i*prime[j]]:=sigma[i] div (3*index[i]+1)*(3*index[i*prime[j]]+1); break; end;
  22. index[i*prime[j]]:=1; sigma[i*prime[j]]:=sigma[i]*4;
  23. end;
  24. end; judge[1]:=0;
  25. for i:=2 to total do judge[i]:=judge[i-1]+abs(judge[i]-1);
  26. for i:=1 to total do index[i]:=index[i-1]+sigma[i];
  27. end;
  28. function GSieve(x:longint;y:int64):int64;
  29. begin
  30. if x=0 then exit(y);
  31. if y<=total then if x>=judge[trunc(sqrt(y))] then exit(judge[y]-x+1);
  32. if sqr(prime[x])>y then GSieve:=GSieve(x-1,y)-1 else GSieve:=GSieve(x-1,y)-GSieve(x-1,y div prime[x]);
  33. end;
  34. function HSieve(x:longint;y:int64):int64;
  35. var i,k:longint;
  36. begin
  37. if x=pos+1 then exit(1); HSieve:=HSieve(x+1,y);
  38. if sqr(prime[x])>y then inc(HSieve) else
  39. begin
  40. i:=1; k:=prime[x];
  41. while k<=y do begin inc(HSieve,HSieve(x+1,y div k)*(3*i+1)); k:=k*prime[x]; inc(i); end;
  42. end;
  43. writeln(prime[x],' ',y,' ',HSieve);
  44. end;
  45. begin
  46. read(n); Euler(total); square:=trunc(sqrt(n));
  47. if n<=total then begin writeln(index[n]); halt; end;
  48. for i:=1 to tail do if sqr(prime[i])>n then begin pos:=i-1; break; end;
  49. for i:=1 to square do inc(ans,sigma[i]*(pos+GSieve(pos+1,n div i)-judge[square])*4 mod modn);
  50. writeln(ans); inc(ans,HSieve(1,n) mod modn); writeln(ans);
  51. end.
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注