Uses math;
Const
total=5000000;
hash_sum=11451411;
modn=maxlongint; // The bigest num
var
tim,gypsy,hudim:array[-1..trunc(sqrt(modn))*2] of longint;
prime,judge,index,sigma:array[-1..total] of longint;
cnt,next,value:array[-1..hash_sum] of longint;
i,tot,pos,tail,square:longint;
l,r,t,n,k,q,ans,val:int64;
procedure Euler(n:longint);
var i,j:longint;
begin
tail:=0; judge[1]:=1; prime[1]:=1; sigma[1]:=1;
for i:=2 to n do
begin
if judge[i]=0 then begin inc(tail); sigma[i]:=4; index[i]:=1; prime[tail]:=i; end;
for j:=1 to tail do
begin
if i*prime[j]>n then break; judge[i*prime[j]]:=1;
if i mod prime[j]=0 then begin index[i*prime[j]]:=index[i]+1;
sigma[i*prime[j]]:=sigma[i] div (3*index[i]+1)*(3*index[i*prime[j]]+1); break; end;
index[i*prime[j]]:=1; sigma[i*prime[j]]:=sigma[i]*4;
end;
end;
judge[1]:=0; index[1]:=1; prime[tail+1]:=total;
for i:=2 to total do begin judge[i]:=judge[i-1]+abs(judge[i]-1); index[i]:=index[i-1]+sigma[i]; end;
end;
procedure Link(val:int64);
begin
inc(tot); value[tot]:=val;
next[tot]:=cnt[val mod hash_sum]; cnt[val mod hash_sum]:=tot;
end;
function Query(val:int64):longint;
var i:longint;
begin
i:=cnt[val mod hash_sum]; Query:=0;
while i<>-1 do begin if value[i]=val then exit(i); i:=next[i]; end;
end;
procedure GSieve;
var i,j:longint;
begin
l:=1; tot:=0;
while l<=n do
begin
Link(n div l); gypsy[tot]:=n div l;
tim[tot]:=0; l:=n div (n div l)+1;
end;
for i:=1 to tail do for j:=1 to tot do
if sqr(prime[i])<value[j] then
begin
val:=Query(value[j] div prime[i]);
dec(gypsy[j],gypsy[val]-(i-1-tim[val])); tim[j]:=i;
end else break;
end;
procedure HSieve;
var i,j:longint;
begin
for i:=tail downto 1 do for j:=1 to tot do
if sqr(prime[i])<value[j] then
begin
if value[j]<prime[i+1] then hudim[j]:=1 else
if value[j]<sqr(prime[i+1]) then
hudim[j]:=(judge[min(total-1,value[j])]-judge[prime[i+1]-1]) << 2+1;
k:=prime[i]; t:=1;
while k<=value[j] do
begin
q:=value[j] div k;
if q<prime[i+1] then val:=1 else
if q<sqr(prime[i+1]) then
val:=(judge[min(total-1,q)]-judge[prime[i+1]-1]) << 2+1 else val:=hudim[Query(q)];
inc(hudim[j],val*(t << 1+t+1));
inc(t); k:=k*prime[i];
end;
end else break;
end;
begin
read(n); Euler(total); square:=trunc(sqrt(n));
if n<=total then begin writeln(index[n]); halt; end;
GSieve; HSieve; l:=1; r:=0;
repeat
val:=Query(n div l); r:=min(total-1,n div (n div l));
if (n div l<total) then t:=1 else t:=gypsy[val]-(tail-tim[val]);
inc(ans,(index[r]-index[l-1])*(t-1) << 2);
until l>=total-1;
writeln(ans+hudim[1]);
end.
// judge SF
// tail m
// total n
// gypsy g
// hudim f
// tot cnt
// cnt head
// val v
// value val
// t c
// k pr
// q k
Uses math;
Const
total=99;
modn=maxlongint;
var
prime,judge,index,sigma:array[-1..total] of longint;
i,pos,tail,square:longint;
n,ans:int64;
procedure Swap(var a,b:longint);var t:longint; begin t:=a; a:=b; b:=t; end;
procedure Euler(n:longint);
var i,j:longint;
begin
tail:=0; judge[1]:=1; prime[1]:=1; sigma[1]:=1;
for i:=2 to n do
begin
if judge[i]=0 then begin inc(tail); sigma[i]:=4; index[i]:=1; prime[tail]:=i; end;
for j:=1 to tail do
begin
if i*prime[j]>n then break; judge[i*prime[j]]:=1;
if i mod prime[j]=0 then begin index[i*prime[j]]:=index[i]+1;
sigma[i*prime[j]]:=sigma[i] div (3*index[i]+1)*(3*index[i*prime[j]]+1); break; end;
index[i*prime[j]]:=1; sigma[i*prime[j]]:=sigma[i]*4;
end;
end; judge[1]:=0;
for i:=2 to total do judge[i]:=judge[i-1]+abs(judge[i]-1);
for i:=1 to total do index[i]:=index[i-1]+sigma[i];
end;
function GSieve(x:longint;y:int64):int64;
begin
if x=0 then exit(y);
if y<=total then if x>=judge[trunc(sqrt(y))] then exit(judge[y]-x+1);
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]);
end;
function HSieve(x:longint;y:int64):int64;
var i,k:longint;
begin
if x=pos+1 then exit(1); HSieve:=HSieve(x+1,y);
if sqr(prime[x])>y then inc(HSieve) else
begin
i:=1; k:=prime[x];
while k<=y do begin inc(HSieve,HSieve(x+1,y div k)*(3*i+1)); k:=k*prime[x]; inc(i); end;
end;
writeln(prime[x],' ',y,' ',HSieve);
end;
begin
read(n); Euler(total); square:=trunc(sqrt(n));
if n<=total then begin writeln(index[n]); halt; end;
for i:=1 to tail do if sqr(prime[i])>n then begin pos:=i-1; break; end;
for i:=1 to square do inc(ans,sigma[i]*(pos+GSieve(pos+1,n div i)-judge[square])*4 mod modn);
writeln(ans); inc(ans,HSieve(1,n) mod modn); writeln(ans);
end.