题目描述:
已知:
f
(
x
)
=
∑
d
∣
x
μ
(
d
)
∗
d
f(x)=\sum_{d|x} \mu(d)*d
f(x)=∑d∣xμ(d)∗d
求
∑
i
=
1
n
∑
j
=
1
n
f
(
gcd
(
i
,
j
)
)
∗
f
(
lcm
(
i
,
j
)
)
m
o
d
1
0
9
+
7
\sum\limits_{i=1}^n \sum\limits_{j=1}^n f(\gcd(i,j))*f(\text{lcm}(i,j))~~\mod 10^9+7
i=1∑nj=1∑nf(gcd(i,j))∗f(lcm(i,j)) mod109+7
n
≤
1
0
9
n\le10^9
n≤109
题目分析:
这个题。。认真你就输了。。
根据
μ
(
d
)
∗
d
\mu(d)*d
μ(d)∗d是积性函数,它的卷积也是积性函数。
所以有:
f
(
gcd
(
i
,
j
)
)
∗
f
(
lcm
(
i
,
j
)
)
=
f
(
i
)
∗
f
(
j
)
f(\gcd(i,j))*f(\text{lcm}(i,j))=f(i)*f(j)
f(gcd(i,j))∗f(lcm(i,j))=f(i)∗f(j)
因为
gcd
\gcd
gcd和
lcm
\text{lcm}
lcm一个是取质因子中较小的,一个是取质因子中较大的,按照质因子拆开后重新组合就可以得到
f
(
i
)
∗
f
(
j
)
f(i)*f(j)
f(i)∗f(j)
于是问题就变成了求
(
∑
i
=
1
n
f
(
i
)
)
2
(\sum\limits_{i=1}^{n}f(i))^2
(i=1∑nf(i))2
简单变换一下就是
(
∑
d
=
1
n
μ
(
d
)
∗
d
∗
⌊
n
d
⌋
)
2
(\sum_{d=1}^n\mu(d)*d*\lfloor\frac nd\rfloor)^2
(d=1∑nμ(d)∗d∗⌊dn⌋)2
杜教筛筛
μ
(
d
)
∗
d
\mu(d)*d
μ(d)∗d的前缀和即可,
(
μ
⋅
i
d
)
∗
i
d
=
ϵ
(\mu\cdot id)*id=\epsilon
(μ⋅id)∗id=ϵ
Code:
#include<bits/stdc++.h>
#define maxn 1000005
using namespace std;
const int mod = 1e9+7;
int n,s[maxn],p[maxn/5],F[maxn];
bool v[maxn];
void Prime(const int N){
s[1]=1;int m=0;
for(int i=2;i<=N;i++){
if(!v[i]) p[++m]=i,s[i]=-1;
for(int j=1,k;j<=m&&(k=i*p[j])<=N;j++){
v[k]=1; if(i%p[j]==0) break; s[k]=-s[i];
}
}
for(int i=1;i<=N;i++) s[i]=(s[i-1]+s[i]*i)%mod;
}
int solve(int n){
if(n<=maxn-5) return s[n];
if(~F[::n/n]) return F[::n/n];
int ret=1;
for(int i=2,j;i<=n;i=j+1)
j=n/(n/i),ret=(ret-1ll*(i+j)*(j-i+1)/2%mod*solve(n/i))%mod;
return F[::n/n]=(ret+mod)%mod;
}
int main()
{
Prime(maxn-5),memset(F,-1,sizeof F);
scanf("%d",&n);
int ans=0;
for(int i=1,j;i<=n;i=j+1)
j=n/(n/i),ans=(ans+1ll*(n/i)*(solve(j)-solve(i-1)))%mod;
printf("%d\n",1ll*ans*ans%mod);
}