Description
神炎皇乌利亚很喜欢数对,他想找到神奇的数对。
对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对。请问这样的数对共有多少呢?
Solution
从题意上来看(a+b)是(a*b)的因子,设
d=gcd(a,b)
a′=ad
b′=bd
。
(a+b)|(a∗b)
可以等价为
(a′+b′)∗d|a′∗b′∗d2
∵
gcd(a,b)=d
∴
gcd(a′,b′)=1
且
(a′+b′)|d
,也意味着
(a′+b′)≤d
又∵
a+b≤n
即
(a′+b′)∗d≤n
∴不妨枚举
k=(a′+b′)
,对于枚举出的这个值共有
nk2
个是对应合法的,而求
(a′+b′)=k
且
a′
与
b′
互质的对数,很明显就是求
φ(k)
,用线性筛就能够完成了。
Code
var
n,ans,sum,i,maxn:int64;
s,f:array[0..10000000] of longint;
p:array[0..10000000] of boolean;
pd:boolean;
procedure phi;
var i,j,maxn:longint;
begin
maxn:=trunc(sqrt(n));
for i:=2 to maxn do
begin
if p[i]=false then
begin
inc(s[0]);s[s[0]]:=i;p[i]:=true;f[i]:=i-1;
end;
for j:=1 to s[0] do
begin
if i*s[j]>maxn then break;
p[i*s[j]]:=true;
if i mod s[j]=0 then
begin
f[i*s[j]]:=f[i]*s[j];
break;
end
else f[i*s[j]]:=f[i]*(s[j]-1);
end;
end;
end;
begin
readln(n);
phi;
maxn:=trunc(sqrt(n));
i:=1;
while i<maxn do
begin
inc(i);
sum:=n div (i*i);
ans:=ans+f[i]*sum;
end;
writeln(ans);
end.