题意:
问多少对a,ba,ba,b满足1≤a<b≤n1 \le a < b \le n1≤a<b≤n且(a+b)∣ab(a+b)|ab(a+b)∣ab
题解:
先考虑什么情况满足a+b∣aba+b|aba+b∣ab
设d=gcd(a,b)d=gcd(a,b)d=gcd(a,b),则a′d+b′d∣a′b′d2−>a′+b′∣a′b′da'd+b'd|a'b'd^2->a'+b'|a'b'da′d+b′d∣a′b′d2−>a′+b′∣a′b′d
因为a′,b′a',b'a′,b′互质,所以a′+b′,a′b′a'+b',a'b'a′+b′,a′b′也互质
那么就是a′+b′∣da'+b'|da′+b′∣d
因为d>b′d>b'd>b′所以b′<=nb'<=\sqrt nb′<=n
设m=nm=\sqrt nm=n
ans=∑b=1m∑a=1b−1[(a,b)=1]⌊na+b⌋ans=\sum_{b=1}^m\sum_{a=1}^{b-1}[(a,b)=1]\lfloor \frac{n}{a+b} \rfloorans=b=1∑ma=1∑b−1[(a,b)=1]⌊a+bn⌋
=∑dmμ(d)∑b=1⌊md⌋∑a=1b−1⌊n(a+b)d2⌋=\sum_d^m \mu(d)\sum_{b=1}^{\lfloor \frac md \rfloor}\sum_{a=1}^{b-1}\lfloor \frac{n}{(a+b)d^2} \rfloor=d∑mμ(d)b=1∑⌊dm⌋a=1∑b−1⌊(a+b)d2n⌋
直接算就好了,复杂度什么的不存在的
code:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cmath>
#define LL long long
using namespace std;
bool v[100010];
LL prime[100010],pr=0,mu[100010];
void pre()
{
memset(v,true,sizeof(v));
mu[1]=1;
for(LL i=2;i<=100000;i++)
{
if(v[i]) prime[++pr]=i,mu[i]=-1;
for(LL j=1;j<=pr&&i*prime[j]<=100000;j++)
{
LL s=i*prime[j];v[s]=false;
if(i%prime[j]==0) {mu[s]=0;break;}
mu[s]=-mu[i];
}
}
}
LL n,m;
LL calc(LL n,LL m)
{
LL ans=0;
LL k;
for(LL i=1;i<=m;i++)
{
LL t=n/i;
for(LL j=i+1;j<(i<<1)&&j<=t;j=k+1)
{
k=min((i<<1)-1,t/(t/j));
ans+=(k-j+1)*(t/j);
}
}
return ans;
}
int main()
{
pre();
scanf("%lld",&n);m=sqrt(n);
LL ans=0;
for(LL i=1;i<=m;i++) if(mu[i]!=0) ans+=mu[i]*calc(n/i/i,m/i);
printf("%lld",ans);
}

357

被折叠的 条评论
为什么被折叠?



