题解:
莫比乌斯反演复习。
题目即求:
∑i=1A∑j=1B[μ(gcd(i,j))!=0]lcm(i,j)
∑
i
=
1
A
∑
j
=
1
B
[
μ
(
g
c
d
(
i
,
j
)
)
!
=
0
]
l
c
m
(
i
,
j
)
枚举gcd:
∑d=1min(A,B)[μ(d)==1]d∑i=1⌊Ad⌋∑j=1⌊Bd⌋[gcd(i,j)==1]ij
∑
d
=
1
m
i
n
(
A
,
B
)
[
μ
(
d
)
==
1
]
d
∑
i
=
1
⌊
A
d
⌋
∑
j
=
1
⌊
B
d
⌋
[
g
c
d
(
i
,
j
)
==
1
]
i
j
∑d=1min(A,B)[μ(d)==1]d∑i=1⌊Ad⌋∑j=1⌊Bd⌋ij∑k|i且k|jμ(k)
∑
d
=
1
m
i
n
(
A
,
B
)
[
μ
(
d
)
==
1
]
d
∑
i
=
1
⌊
A
d
⌋
∑
j
=
1
⌊
B
d
⌋
i
j
∑
k
|
i
且
k
|
j
μ
(
k
)
∑d=1min(A,B)[μ(d)==1]d∑k=1min(⌊Ad⌋,⌊Bd⌋)μ(k)k2(1+⌊Adk⌋)⌊Adk⌋2(1+⌊Bdk⌋)⌊Bdk⌋2
∑
d
=
1
m
i
n
(
A
,
B
)
[
μ
(
d
)
==
1
]
d
∑
k
=
1
m
i
n
(
⌊
A
d
⌋
,
⌊
B
d
⌋
)
μ
(
k
)
k
2
(
1
+
⌊
A
d
k
⌋
)
⌊
A
d
k
⌋
2
(
1
+
⌊
B
d
k
⌋
)
⌊
B
d
k
⌋
2
设T=dk,枚举T
∑T=1min(A,B)(1+⌊AT⌋)⌊AT⌋2(1+⌊BT⌋)⌊BT⌋2∑d|T[μ(d)==1]dμ(Td)(Td)2
∑
T
=
1
m
i
n
(
A
,
B
)
(
1
+
⌊
A
T
⌋
)
⌊
A
T
⌋
2
(
1
+
⌊
B
T
⌋
)
⌊
B
T
⌋
2
∑
d
|
T
[
μ
(
d
)
==
1
]
d
μ
(
T
d
)
(
T
d
)
2
然后右边那堆可以 O(nlogn) O ( n l o g n ) 预处理,左边可以分块。
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pa pair<int,int>
const int Maxn=4000010;
const int inf=4000000;
const LL mod=(1LL<<30);
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x*f;
}
int prime[400000],len=0,mu[Maxn];
LL f[Maxn],sum[Maxn];
bool mark[Maxn];
void pre()
{
memset(mark,false,sizeof(mark));
mu[1]=1;
for(int i=2;i<=inf;i++)
{
if(!mark[i])prime[++len]=i,mu[i]=-1;
for(int j=1;j<=len&&prime[j]*i<=inf;j++)
{
mark[prime[j]*i]=true;
if(i%prime[j]==0)
{
mu[prime[j]*i]=0;
break;
}
mu[prime[j]*i]=-mu[i];
}
}
for(int d=1;d<=inf;d++)
{
if(mu[d]==0)continue;
for(int T=d;T<=inf;T+=d)
f[T]=(f[T]+(d*((T/d)*(T/d)%mod)%mod)*mu[T/d]+mod)%mod;
}
sum[0]=0;
for(int i=1;i<=inf;i++)sum[i]=(sum[i-1]+f[i])%mod;
}
int main()
{
pre();
int T=read();
while(T--)
{
int n=read(),m=read();
int pos;
LL ans=0;
for(int T=1;T<=min(n,m);T=pos+1)
{
pos=min(n/(n/T),m/(m/T));
ans=(ans+((sum[pos]-sum[T-1]+mod)%mod)*((1+n/T)*(n/T)/2LL%mod)*((1+m/T)*(m/T)/2LL%mod))%mod;
}
printf("%lld\n",ans);
}
}