我们先穷举素数p
然后令y>x 这样问题就是求这个gcd(x,y)=p (1<=x<y=n)
不难发现必须y=kp k∈N* 当y=p时,易知个数为φ(1)
当y=2p 个数为φ(2),……当k最大为[n/p]时,个数为φ([n/p])
这不就是求欧拉函数的前缀和
因此我们要用筛法把φ(1~n)求出来弄一下前缀和即可
var p:array[..] of longint;
f:array[..] of int64;
v:array[..] of boolean;
n,i,j,t:longint;
ans:int64; begin
readln(n);
fillchar(v,sizeof(v),false);
f[]:=;
for i:= to n do
begin
if not v[i] then
begin
inc(t);
p[t]:=i;
f[i]:=i-;
end;
for j:= to t do
if p[j]*i<=n then
begin
v[p[j]*i]:=true;
if i mod p[j]= then
begin
f[i*p[j]]:=f[i]*int64(p[j]);
break;
end
else f[i*p[j]]:=f[i]*int64(p[j]-);
end
else break;
end; for i:= to n do
f[i]:=f[i-]+f[i]; for i:= to t do
ans:=ans+(f[n div p[i]]-)*+; //注意x=y
writeln(ans);
end.