题目
对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对。请问这样的数对共有多少呢?
数据范围:
N≤1014
题解
我们设
gcd(a,b)=d
,
再设
a′=ad
,
b′=bd
.
则
gcd(a′,b′)=1
.
可以得出
a′+b′∤a′b′
则
gcd(a′+b′,a′)=1
。
∵
a+b|ab
∴
(a′+b′)d|a′b′d2
。
∵
a′+b′∤a′b′
∴
a′+b′|d
设
d=i(a′+b′)
则
a+b=d(a′+b′)=i(a′+b′)2≤n
于是我们枚举
k=a′+b′
,
则i可能取的值有
⌊nk2⌋∗gcd(a′+b′,a′)
对于合法的
a′
,有
φ(a′+b′)
个.
所以,
ans=Σ⌊n√⌋k=1∗⌊nk2⌋∗φ(k)
欧拉函数可以用线性筛法求。
时间复杂度: O(n−−√)
#include<iostream>
#include<cstdio>
#include<cmath>
#define N 10000010
#define LL long long
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
LL ss[N],phi[N];
LL i,j,k,l,n,m,tot,ans;
int main()
{
scanf("%lld",&n);
fo(i,2,N-10)
{
if (!ss[i])
{
ss[++tot]=i;
phi[i]=i-1;
}
fo(j,1,tot)
{
if (i*ss[j]>N-10) break;
ss[i*ss[j]]=1;
if (i%ss[j]==0) phi[i*ss[j]]=phi[i]*ss[j];
else phi[i*ss[j]]=phi[i]*(ss[j]-1);
}
}
fo(i,1,N-10)
{
if (i*i>n) break;
ans=ans+phi[i]*(n/(i*i));
}
printf("%lld",ans);
}