Description
神炎皇乌利亚很喜欢数对,他想找到神奇的数对。
对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对。请问这样的数对共有多少呢?
Input
一行一个整数n。
Output
一行一个整数表示答案,保证不超过64位整数范围。
Sample Input
21
Sample Output
11
Data Constraint
对于20%的数据n<=1000;
对于40%的数据n<=100000;
对于60%的数据n<=10000000;
对于80%的数据n<=1000000000000;
对于100%的数据n<=100000000000000。
一直没想出来怎么做,于是随便打了个暴力。
我表示正解脑洞挺大= =
设gcd(a,b)=d,a’*d=a,b’*d=b,那么,(a’+b’)*d|a’*b’*d²,化简为(a’+b’)|a’*b’*d
同理(a’+b’)*d<=n,然后就可以在根号范围内求解a’+b’,
然后我们可以发现我们可以发现:a’、b’互质,那么它们乘起来必然除了1和它本身及a’、b’外,没有其他因子。所以a’+b’|d
然后可以设j=a’+b’;假设如果j和a’或b’有公因数,j可以进一步缩小,所以只要求gcd(a’,j)=1和gcd(b’,j)=1的种类数。
d*k<=n 推得 d<=(n/k²),求<=k的范围内有多少数与K互质,即求φ(k),线性筛求解
const maxn=10000000;
var
n,m,p,k,ans:int64;
i,j:longint;
phi,prime:array[0..maxn]of longint;
bo:array[0..maxn]of boolean;
begin
assign(input,'uria.in');
assign(output,'uria.out');
reset(input);
rewrite(output);
readln(n);
m:=trunc(sqrt(n));
phi[1]:=1;
for i:=2 to m do
begin
if not bo[i] then
begin
bo[i]:=true;
inc(k);
prime[k]:=i;
phi[i]:=i-1;
end;
for j:=1 to k do
begin
if i*prime[j]>m then break;
bo[i*prime[j]]:=true;
if (i mod prime[j]<>0)then phi[i*prime[j]]:=phi[i]*(prime[j]-1)
else
begin
phi[i*prime[j]]:=phi[i]*(prime[j]);
break;
end;
end;
ans:=ans+phi[i]*(n div i div i);
end;
writeln(ans);
end.