T1 天空龙
巨水,不讲。
T3 太阳神
【问题描述】
太阳神拉很喜欢最小公倍数,有一天他想到了一个关于最小公倍 数的题目。
求满足如下条件的数对(a,b)对数:
a,b 均为正整数且 a,b<=n 而 lcm(a,b)>n。
其中的 lcm 当然表示最小公倍数。答案对 1,000,000,007 取模
【输入格式】
第一行一个正整数 n。
【输出格式】
一行一个整数表示答案,对 1,000,000,007 取模。
解析
问题先转化为求:
∑
i
=
1
n
∑
j
=
1
n
1
[
l
c
m
(
i
,
j
)
>
n
]
\sum_{i=1}^n\sum_{j=1}^n1[lcm(i,j)>n]
i=1∑nj=1∑n1[lcm(i,j)>n]
因为
i
i
i和
j
j
j总共的搭配有
n
2
n^2
n2种,所以问题可以转化为求:
n
2
−
∑
i
=
1
n
∑
j
=
1
n
1
[
l
c
m
(
i
,
j
)
≤
n
]
n^2-\sum_{i=1}^n\sum_{j=1}^n1[lcm(i,j)\leq n]
n2−i=1∑nj=1∑n1[lcm(i,j)≤n]
明显,
∑
i
=
1
n
∑
j
=
1
n
1
[
l
c
m
(
i
,
j
)
≤
n
]
\sum_{i=1}^n\sum_{j=1}^n1[lcm(i,j)\leq n]
∑i=1n∑j=1n1[lcm(i,j)≤n]要更好求一些。下面我们探讨如何求该式。
首先,由
l
c
m
(
x
,
y
)
=
x
⋅
y
g
c
d
(
x
,
y
)
lcm(x,y)=\frac{x·y}{gcd(x,y)}
lcm(x,y)=gcd(x,y)x⋅y,原式转化为:
∑
i
=
1
n
∑
j
=
1
n
1
[
i
⋅
j
g
c
d
(
i
,
j
)
≤
n
]
\sum_{i=1}^n\sum_{j=1}^n1[\frac{i·j}{gcd(i,j)}\leq n]
i=1∑nj=1∑n1[gcd(i,j)i⋅j≤n]
设
g
c
d
(
i
,
j
)
=
d
gcd(i,j)=d
gcd(i,j)=d,则
i
⋅
j
g
c
d
(
i
,
j
)
≤
n
\frac{i·j}{gcd(i,j)}\leq n
gcd(i,j)i⋅j≤n可转化为
i
d
⋅
j
d
≤
n
d
\frac{i}{d}·\frac{j}{d}\leq\frac{n}{d}
di⋅dj≤dn,上式转化为:
∑
i
=
1
n
∑
j
=
1
n
1
[
i
d
⋅
j
d
≤
n
d
]
\sum_{i=1}^n\sum_{j=1}^n1[\frac{i}{d}·\frac{j}{d}\leq\frac{n}{d}]
i=1∑nj=1∑n1[di⋅dj≤dn]
枚举
g
c
d
(
i
,
j
)
=
d
gcd(i,j)=d
gcd(i,j)=d,设
x
=
i
d
x=\frac{i}{d}
x=di,
y
=
j
d
y=\frac{j}{d}
y=dj,由
g
c
d
gcd
gcd的定义可知
g
c
d
(
x
,
y
)
=
1
gcd(x,y)=1
gcd(x,y)=1,原式转化为:
∑
d
=
1
n
∑
x
=
1
n
∑
y
=
1
n
[
g
c
d
(
x
,
y
)
=
1
]
[
x
y
≤
n
d
]
\sum_{d=1}^n\sum_{x=1}^n\sum_{y=1}^n[gcd(x,y)=1][xy\leq \frac{n}{d}]
d=1∑nx=1∑ny=1∑n[gcd(x,y)=1][xy≤dn]
对
g
c
d
(
x
,
y
)
=
1
gcd(x,y)=1
gcd(x,y)=1进行莫比乌斯反演,得:
∑
d
=
1
n
∑
x
=
1
n
∑
y
=
1
n
∑
k
∣
g
c
d
(
x
,
y
)
μ
(
k
)
[
x
y
≤
n
d
]
\sum_{d=1}^n\sum_{x=1}^n\sum_{y=1}^n\sum_{k|gcd(x,y)}\mu(k)[xy\leq \frac{n}{d}]
d=1∑nx=1∑ny=1∑nk∣gcd(x,y)∑μ(k)[xy≤dn]
将
k
k
k提前,得:
∑
k
μ
(
k
)
∑
d
=
1
n
∑
k
∣
x
∑
k
∣
y
[
x
y
≤
n
d
]
\sum_k\mu(k)\sum_{d=1}^n\sum_{k|x}\sum_{k|y}[xy\leq\frac{n}{d}]
k∑μ(k)d=1∑nk∣x∑k∣y∑[xy≤dn]
因为
k
k
k既是
x
x
x的因数,又是
y
y
y的因数,所以可以在中括号里同除两个
k
k
k,从而抵消掉
∑
k
∣
x
∑
k
∣
y
\sum_{k|x}\sum_{k|y}
∑k∣x∑k∣y,得到:
∑
d
=
1
n
μ
(
k
)
[
d
x
y
≤
n
k
2
]
\sum_{d=1}^n\mu(k)[dxy\leq\frac{n}{k^2}]
d=1∑nμ(k)[dxy≤k2n]
所以这道题就变成了枚举 k k k,求 d , x , y d,x,y d,x,y的可能取值组数。因为 k ∣ g c d ( x , y ) k|gcd(x,y) k∣gcd(x,y),而 g c d ( x , y ) ≤ n gcd(x,y)\leq\sqrt n gcd(x,y)≤n,所以 k k k只有 n \sqrt n n种取值。
因为不知道 x , y , d x,y,d x,y,d的大小关系,所以不妨假设 x ≤ y ≤ d x\leq y\leq d x≤y≤d,那么 x 3 x^3 x3一定小于 n k 2 \frac{n}{k^2} k2n, x 2 y x^2y x2y也一定小于 n k 2 \frac{n}{k^2} k2n。所以外层枚举 k k k,内层枚举 x , y x,y x,y注意 y y y要从 x x x开始枚举。然后讨论 d d d的取值种类。 d d d的取值种类有 n k 2 ⋅ x ⋅ y − y \frac{n}{k^2·x·y}-y k2⋅x⋅yn−y种。由排列组合的知识可知,若 x = = y x==y x==y,总情况要乘3,;若 x ! = y x!=y x!=y,总情况要乘6.最后乘 μ ( k ) \mu(k) μ(k),计入总答案。复杂度约为 O ( n 2 3 ) O(n^{\frac{2}{3}}) O(n32)(我不会微积分)。
代码
#include<cstdio>
#include<cmath>
#define ll long long
#define maxn 100005
#define mod 1000000007
using namespace std;
ll n,m,tot,ans;
ll mu[maxn],prime[maxn];
bool mark[maxn];
void getmu()
{
mu[1]=1;
for(int i=2;i<=100000;++i)
{
if(!mark[i])
{
prime[++tot]=i;
mu[i]=-1;
}
for(int j=1;j<=tot;++j)
{
if(i*prime[j]>100000)break;
mark[i*prime[j]]=1;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
break;
}
else
mu[i*prime[j]]=-mu[i];
}
}
}
int main()
{
getmu();
scanf("%lld",&n);
m=sqrt(n+0.5);
for(ll i=1;i<=m;++i)
{
ll nw=n/i/i,sum=0;
for(ll a=1;a*a*a<=nw;++a)//枚举a
{
for(ll b=a;b*b<=nw/a;++b)//枚举b
{
ll c=nw/a/b-b;
if(a==b)sum=(sum+c*3+1)%mod;
else sum=(sum+c*6+3)%mod;
}
}
sum*=mu[i];
ans=(ans+sum)%mod;
}
ans=(((n%mod)*(n%mod)-ans)%mod+mod)%mod;
printf("%lld",ans);
return 0;
}
总结
对于莫比乌斯反演的题目,要先化公式(显然),尽量化出带等号的式子,然后莫比乌斯反演一下。不过我这辈子应该没机会再做这种题了吧。