解题:洛谷2257 YY的GCD

题面

初见莫比乌斯反演

有一个套路是关于GCD的反演经常设$f(d)=sum_{gcd(i,j)==d},g(d)=sum_{d|gcd(i,j)}$,然后推推推

$sumlimits_{i=1}^nsumlimits_{j=1}^m[gcd(i,j)==prime]$

$sum_{p∈prime}f(p)$

$sum_{p∈prime} sum_{d=1}^{min(n,m)} [p|d] μ(frac{d}{p})g(d)$

套路的,改为枚举$frac{d}{p}$

$sum_{p∈prime} sum_{d=1}^{min(leftlfloorfrac{n}{p} ight floor,leftlfloorfrac{m}{p} ight floor)}μ(d)g(dp)$

这时候可以换掉$g$了

$sum_{p∈prime} sum_{d=1}^{min(leftlfloorfrac{n}{p} ight floor,leftlfloorfrac{m}{p} ight floor)}μ(d)leftlfloorfrac{n}{dp} ight floorleftlfloorfrac{m}{dp} ight floor$

然后换回枚举现在的$dp$(即原来的$d$),交换求和号

$sumlimits_{i=1}^{min(n,m)}sum_{d|i&&d∈prime}μ(frac{i}{d})leftlfloorfrac{n}{i} ight floorleftlfloorfrac{m}{i} ight floor$

$sumlimits_{i=1}^{min(n,m)}leftlfloorfrac{n}{i} ight floorleftlfloorfrac{m}{i} ight floorsum_{d|i&&d∈prime}μ(frac{i}{d})$

于是数论分块,前面的直接算,后面的线性筛之后$O(nlog n)$预处理一下再做个前缀和

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=10000005;
 6 int npr[N],pri[N],mul[N];
 7 long long mulsum[N],ans;
 8 int T,n,m,nm,cnt,maxx;
 9 void prework()
10 {
11     register int i,j;
12     mul[1]=1,npr[1]=true,maxx=10000000;
13     for(i=2;i<=maxx;i++)
14     {
15         if(!npr[i]) pri[++cnt]=i,mul[i]=-1;
16         for(j=1;j<=cnt&&1ll*i*pri[j]<=maxx;j++)
17         {
18             npr[i*pri[j]]=true;
19             if(i%pri[j]==0) break;
20             else mul[i*pri[j]]=-mul[i];
21         }
22     }
23     for(i=1;i<=maxx;i++)
24         for(j=1;j<=cnt&&1ll*i*pri[j]<=maxx;j++)
25             mulsum[i*pri[j]]+=mul[i];
26     for(i=1;i<=maxx;i++) mulsum[i]+=mulsum[i-1];
27 }
28 int main()
29 {
30     register int i,j;
31     scanf("%d",&T),prework();
32     while(T--)
33     {
34         scanf("%d%d",&n,&m),ans=0,nm=min(n,m);
35         for(i=1;i<=nm;i=j+1)
36         {
37             j=min(n/(n/i),m/(m/i));
38             ans+=(mulsum[j]-mulsum[i-1])*(n/i)*(m/i);
39         }
40         printf("%lld
",ans);
41     }
42     return 0;
43 }
View Code
原文地址:https://www.cnblogs.com/ydnhaha/p/10116461.html