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。
题解
我们设z=gcd(a,b)
则,
a=x∗z,b=y∗z
a+b=
(x+y)∗z
ab=
x∗y∗z2
∵a+b | ab
∴
(x+y)∗z|x∗y∗z2
∵gcd(x,y)=1
∴
x+y|z
设k=x+y
此时,合法的z有n÷
k2
个,当x+y=k时,x和y有phi(k)对。
欧拉函数可以线性求。
code(c++)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define N 10000003
#define ll long long
using namespace std;
ll ans,n,x,m;
int phi[N+10],prime[N+10],tot;
bool mark[N+10];
ll gcd(ll x,ll y)
{if(x%y==0)return y;else return gcd(y,x%y);}
void getphi()
{
int i,j;
phi[1]=1;
for(i=2;i<=N;i++)
{
if(!mark[i])
{
prime[++tot]=i;
phi[i]=i-1;
}
for(j=1;j<=tot;j++)
{
if(i*prime[j]>N) break;
mark[i*prime[j]]=1;
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
int main()
{
getphi();
freopen("uria.in","r",stdin);
freopen("uria.out","w",stdout);
scanf("%lld",&n);
m=sqrt(n)+1;
for(x=2;x<m;x++)
ans=ans+n/x/x*phi[x];
printf("%lld",ans);
}