Uses math;Const total=5000000; hash_sum=11451411; modn=maxlongint; // The bigest numvar 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.