Description
神炎皇乌利亚很喜欢数对,他想找到神奇的数对。
对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对。请问这样的数对共有多少呢?
对于100%的数据n<=10^14。
Analysis
设
a=a′x,b=b′x,n=gcd(a,b),ab=a′b′x2
那么
gcd(a′,b′)=1,a+b=(a′+b′)x
∵a+b|ab
∴a′+b′|a′b′x
∵(a′,b′)=1∴(a′+b′,b′)=(a′,a′+b′)=1
∴(a′+b′,ab)=1
那么若要满足条件,则需满足
a′+b′|x
因为
(a′+b′)x<=n
所以
a′+b′=d<=n√
枚举
d
,则合法的
所以,答案为
∑n√d=1φ(d)∗⌊n/d2⌋
Code
#include<cstdio>
#include<cmath>
#include<algorithm>
#define fo(i,a,b) for(ll i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int N=10000010;
ll n,m,pri[N],phi[N];
bool bz[N];
void get(ll n)
{
fo(i,2,n)
{
if(!bz[i]) pri[++pri[0]]=i,phi[i]=i-1;
fo(j,1,pri[0])
{
ll t=i*pri[j];
if(t>n) break;
bz[t]=1;
if(i%pri[j]==0)
{
phi[t]=phi[i]*pri[j];
break;
}
phi[t]=phi[i]*phi[pri[j]];
}
}
}
int main()
{
freopen("uria.in","r",stdin);
freopen("uria.out","w",stdout);
ll ans=0,t;
scanf("%lld",&n);
m=sqrt(n);
get(m);
fo(i,2,m)
ans=ans+phi[i]*(n/(i*i));
printf("%lld",ans);
return 0;
}