传送门
题解:
十分扯淡的莫反题。
我们要求的是这个东西:
A n s = ∑ i = 1 n ∑ j = 1 i − 1 [ ( i + j ) ∣ i j ] Ans=\sum_{i=1}^n\sum_{j=1}^{i-1}[(i+j)\mid ij] Ans=i=1∑nj=1∑i−1[(i+j)∣ij]
直接骚推就行了。
A n s = ∑ d = 1 n ∑ i = 1 n ∑ j = 1 i − 1 [ g c d ( i , j ) = d ] [ ( i + j ) ∣ i j ] = ∑ d = 1 n ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 i − 1 [ g c d ( i , j ) = 1 ] [ ( i + j ) d ∣ i j d 2 ] = ∑ d = 1 n ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 i − 1 [ g c d ( i , j ) = 1 ] [ ( i + j ) ∣ d ] = ∑ i = 1 n ∑ j = 1 i − 1 [ g c d ( i , j ) = 1 ] ∑ d = 1 ⌊ n i ⌋ [ ( i + j ) ∣ d ] = ∑ i = 1 n ∑ j = 1 i − 1 [ g c d ( i , j ) = 1 ] ⌊ n i ( i + j ) ⌋ = ∑ t = 1 n μ ( t ) ∑ i = 1 ⌊ n t ⌋ ∑ j = i + 1 2 i − 1 ⌊ n i j ⌋ \begin{aligned} Ans=&\sum_{d=1}^n\sum_{i=1}^n\sum_{j=1}^{i-1}[gcd(i,j)=d][(i+j)\mid ij]\\ =&\sum_{d=1}^n\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{i-1}[gcd(i,j)=1][(i+j)d\mid ijd^2]\\ =&\sum_{d=1}^n\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{i-1}[gcd(i,j)=1][(i+j)\mid d]\\ =&\sum_{i=1}^n\sum_{j=1}^{i-1}[gcd(i,j)=1]\sum_{d=1}^{\lfloor\frac{n}{i}\rfloor}[(i+j)\mid d]\\ =&\sum_{i=1}^{\sqrt n}\sum_{j=1}^{i-1}[gcd(i,j)=1]\lfloor\frac{n}{i(i+j)}\rfloor\\ =&\sum_{t=1}^{\sqrt n}\mu(t)\sum_{i=1}^{\lfloor\frac{\sqrt n}{t}\rfloor}\sum_{j=i+1}^{2i-1}\lfloor\frac{n}{ij}\rfloor \end{aligned} Ans======d=1∑ni=1∑nj=1∑i−1[gcd(i,j)=d][(i+j)∣ij]d=1∑ni=1∑⌊dn⌋j=1∑i−1[gcd(i,j)=1][(i+j)d∣ijd2]d=1∑ni=1∑⌊dn⌋j=1∑i−1[gcd(i,j)=1][(i+j)∣d]i=1∑nj=1∑i−1[gcd(i,j)=1]d=1∑⌊in⌋[(i+j)∣d]i=1∑nj=1∑i−1[gcd(i,j)=1]⌊i(i+j)n⌋t=1∑nμ(t)i=1∑⌊tn⌋j=i+1∑2i−1⌊ijn⌋
枚举 t t t,枚举 i i i, j j j整除分块即可。
复杂度由积分可知为 O ( n 3 4 ) O(n^\frac{3}{4}) O(n43)
代码:
#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs const
cs int N=1e5+7;
int p[N],pc;
bool mark[N];
int mu[N];
inline void linear_sieves(int lim){
mu[1]=1;
for(int re i=2;i<=lim;++i){
if(!mark[i])p[++pc]=i,mu[i]=-1;
for(int re j=1;i*p[j]<=lim;++j){
mark[i*p[j]]=true;
if(i%p[j])mu[i*p[j]]=-mu[i];
else break;
}
}
}
ll n,sqn;ll ans;
inline ll solve(int m,int n){
ll ans=0;
for(int re i=1;i<=m;++i){
ll t=n/i;
for(int re l=i+1,r;l<(i<<1)&&l<=t;l=r+1){
r=std::min<int>((i<<1)-1,t/(t/l));
ans+=(ll)(r-l+1)*(t/l);
}
}
return ans;
}
signed main(){
#ifdef zxyoi
freopen("calc.in","r",stdin);
#endif
scanf("%lld",&n);sqn=sqrt(n);linear_sieves(sqn);
for(int re t=1;t<=sqn;++t)if(mu[t])ans+=mu[t]*solve(sqn/t,n/t/t);
std::cout<<ans<<"\n";
return 0;
}