[luogu4466]和与积

令$d=\gcd(i,j)$,$i'=\frac{i}{d}$,$j'=\frac{j}{d}$,则$(i',j')=1$,可得$(i'+j',i'j')=1$(假设有公因子$p$,必然有$p|i'或j'$,又因为$p|(i'+j')$,则$p|i'$且$p|j'$,与$(i',j')=1$矛盾)

根据这些,原式$(i+j)|ij\iff(i'+j')|i'j'd\iff (i'+j')|d$

考虑枚举$i'$和$j'$,那么答案即$\sum_{i=1}^{n}\sum_{j=i+1}^{n}[\gcd(i,j)=1]\lfloor\frac{n}{(i+j)j}\rfloor$

先对第一维进行反演,得到$\sum_{d=1}^{n}\mu(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=i+1}^{\lfloor\frac{n}{d}\rfloor}\lfloor\frac{n}{(i+j)jd^{2}}\rfloor$

可以发现,右式不为0必要条件为$i<j\le\lfloor \sqrt{\frac{n}{d^{2}}}\rfloor$,因此$d\le \sqrt{n}$,暴力复杂度即$n\int_{1}^{\sqrt{n}}x^{-2}dx=o(n)$

考虑先枚举$j$再对$i+j$数论分块,时间复杂度降为$n^{\frac{3}{4}}\int_{1}^{\sqrt{n}}x^{-\frac{3}{2}}dx=o(n^\frac{3}{4})$,可以通过

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define N 100005
 4 int n,p[N],vis[N],mu[N];
 5 long long ans;
 6 long long calc(int n,int k){
 7     long long ans=0;
 8     for(int i=k+1,j;(i<=n)&&(i<2*k);i=j+1){
 9         j=min(n/(n/i),2*k-1);
10         ans+=(n/i)*(j-i+1);
11     }
12     return ans;
13 }
14 int main(){
15     scanf("%d",&n);
16     mu[1]=1;
17     for(int i=2;i<N-4;i++){
18         if (!vis[i]){
19             p[++p[0]]=i;
20             mu[i]=-1;
21         }
22         for(int j=1;(j<=p[0])&&(i*p[j]<N-4);j++){
23             vis[i*p[j]]=1;
24             if (i%p[j])mu[i*p[j]]=mu[i]*mu[p[j]];
25             else{
26                 mu[i*p[j]]=0;
27                 break;
28             }
29         }
30     }
31     int d=(int)sqrt(n);
32     for(int i=1;i<=d;i++){
33         int m=n/(i*i),dd=(int)sqrt(m);
34         for(int j=1;j<=dd;j++)ans+=mu[i]*calc(m/j,j);
35     }
36     printf("%lld",ans);
37 }
View Code

 

posted @ 2020-10-18 13:42  PYWBKTDA  阅读(156)  评论(0编辑  收藏  举报