题目大意:
求
∑i=1n∑j=1mlcm(i,j)
∑
i
=
1
n
∑
j
=
1
m
l
c
m
(
i
,
j
)
题解:
ans=∑i=1n∑j=1mlcm(i,j)=∑i=1n∑j=1mijgcd(i,j)
a
n
s
=
∑
i
=
1
n
∑
j
=
1
m
l
c
m
(
i
,
j
)
=
∑
i
=
1
n
∑
j
=
1
m
i
j
g
c
d
(
i
,
j
)
设
f(x,y,d)=∑1≤i≤n1≤j≤mgcd(i,j)=dij
f
(
x
,
y
,
d
)
=
∑
1
≤
i
≤
n
1
≤
j
≤
m
g
c
d
(
i
,
j
)
=
d
i
j
F(x,y,d)=∑d|kf(x,y,k)=∑1≤i≤n1≤j≤md|gcd(i,j)ij=d2∑1≤i≤⌊nd⌋1≤j≤⌊md⌋ij=d2⌊nd⌋(⌊nd⌋+1)2⌊md⌋(⌊md⌋+1)2
F
(
x
,
y
,
d
)
=
∑
d
|
k
f
(
x
,
y
,
k
)
=
∑
1
≤
i
≤
n
1
≤
j
≤
m
d
|
g
c
d
(
i
,
j
)
i
j
=
d
2
∑
1
≤
i
≤
⌊
n
d
⌋
1
≤
j
≤
⌊
m
d
⌋
i
j
=
d
2
⌊
n
d
⌋
(
⌊
n
d
⌋
+
1
)
2
⌊
m
d
⌋
(
⌊
m
d
⌋
+
1
)
2
∴
ans=∑d=1min(n,m)d2×f(⌊nd⌋,⌊md⌋,1)d=∑d=1min(n,m)d×f(⌊nd⌋,⌊md⌋,1)
a
n
s
=
∑
d
=
1
m
i
n
(
n
,
m
)
d
2
×
f
(
⌊
n
d
⌋
,
⌊
m
d
⌋
,
1
)
d
=
∑
d
=
1
m
i
n
(
n
,
m
)
d
×
f
(
⌊
n
d
⌋
,
⌊
m
d
⌋
,
1
)
f(x,y,1)=∑d=1min(x,y)μ(k)F(x,y,k)=∑k=1min(x,y)μ(k)k2⌊xk⌋(⌊xk⌋+1)2⌊yk⌋(⌊yk⌋+1)2
f
(
x
,
y
,
1
)
=
∑
d
=
1
m
i
n
(
x
,
y
)
μ
(
k
)
F
(
x
,
y
,
k
)
=
∑
k
=
1
m
i
n
(
x
,
y
)
μ
(
k
)
k
2
⌊
x
k
⌋
(
⌊
x
k
⌋
+
1
)
2
⌊
y
k
⌋
(
⌊
y
k
⌋
+
1
)
2
可以做了
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
const long long MOD=20101009LL,MAXN=10000005LL;
long long sum_mu[MAXN],prime[MAXN/3LL],pcnt;
bool noprime[MAXN];
void init_mu(int);
long long solve(long long,long long);
long long f(long long,long long);
long long sum(long long,long long);
int main()
{
long long n,m;
scanf("%lld%lld",&n,&m);
init_mu(min(n,m));
printf("%lld\n",solve(n,m));
return 0;
}
void init_mu(int N)
{
noprime[1]=1;
sum_mu[1]=1LL;
for(long long i=2LL;i<=N;i++)
{
if(!noprime[i])
{
prime[++pcnt]=i;
sum_mu[i]=-1LL;
}
for(long long j=1;j<=pcnt&&i*prime[j]<=N;j++)
{
noprime[i*prime[j]]=1;
if(i%prime[j]==0)
{
sum_mu[i*prime[j]]=0LL;
break;
}
sum_mu[i*prime[j]]=-sum_mu[i];
}
}
for(long long i=1LL;i<=N;i++)
sum_mu[i]=(sum_mu[i-1]+((((i*i)%MOD)*sum_mu[i])%MOD))%MOD;
}
long long solve(long long n,long long m)
{
long long ret=0LL,last;
if(n>m)
swap(n,m);
for(long long d=1LL;d<=n;d=last+1)
{
last=min(n/(n/d),m/(m/d));
ret=(ret+((sum(d,last)*f(n/d,m/d))%MOD))%MOD;
}
return ret;
}
long long f(long long x,long long y)
{
if(x>y)
swap(x,y);
long long ret=0LL,last,tmp;
for(long long k=1LL;k<=x;k=last+1LL)
{
last=min(x/(x/k),y/(y/k));
tmp=(((((x/k)*(x/k+1LL))>>1LL)%MOD)
*((((y/k)*(y/k+1LL))>>1LL)%MOD))%MOD;
ret=(ret+(((sum_mu[last]-sum_mu[k-1]+MOD)%MOD)*tmp)%MOD)%MOD;
}
return ret;
}
long long sum(long long a,long long b)
{
long long ret;
ret=(((a+b)*(b-a+1LL))>>1LL)%MOD;
return ret;
}