题目描述
给你正整数 a , b , c a,b,c a,b,c,求
∑ i = 1 a ∑ j = 1 b ∑ k = 1 c f ( i , j , k ) \sum\limits_{i=1}^a\sum\limits_{j=1}^b\sum\limits_{k=1}^cf(i,j,k) i=1∑aj=1∑bk=1∑cf(i,j,k)
其中 f f f函数的定义如下:
f ( i , j , k ) = { 1 gcd ( i , j , k ) = 1 0 gcd ( i , j , k ) ≠ 1 f(i,j,k)= \left\{\begin{matrix} 1\qquad \gcd(i,j,k)=1 \\ \\ 0\qquad \gcd(i,j,k)\neq 1 \end{matrix}\right. f(i,j,k)=⎩ ⎨ ⎧1gcd(i,j,k)=10gcd(i,j,k)=1
输出答案模 1 0 9 + 7 10^9+7 109+7后的值。
输入格式
一行三个正整数 a , b , c a,b,c a,b,c。
输出格式
一行一个正整数,表示答案。
输入样例1
3 4 5
输出样例1
55
输入样例2
816 816 816
输出样例2
718333
数据范围
a × b × c ≤ 4 × 1 0 18 a\times b\times c\leq 4\times 10^{18} a×b×c≤4×1018
题解
前置知识:莫比乌斯反演
我们不妨设 a ≤ b ≤ c a\leq b\leq c a≤b≤c,则显然 1 ≤ a ≤ 2 × 1 0 6 1\leq a\leq 2\times 10^6 1≤a≤2×106。
题目即求
∑ i = 1 a ∑ j = 1 b ∑ k = 1 c [ gcd ( i , j , k ) = = 1 ] \sum\limits_{i=1}^a\sum\limits_{j=1}^b\sum\limits_{k=1}^c[\gcd(i,j,k)==1] i=1∑aj=1∑bk=1∑c[gcd(i,j,k)==1]
利用莫比乌斯函数的性质,原式变为
∑ i = 1 a ∑ j = 1 b ∑ k = 1 c ∑ d ∣ i , d ∣ j , d ∣ k μ ( d ) \sum\limits_{i=1}^a\sum\limits_{j=1}^b\sum\limits_{k=1}^c\sum\limits_{d|i,d|j,d|k}\mu(d) i=1∑aj=1∑bk=1∑cd∣i,d∣j,d∣k∑μ(d)
枚举 d d d得
∑ d = 1 a μ ( d ) × ⌊ a d ⌋ × ⌊ b d ⌋ × ⌊ c d ⌋ \sum\limits_{d=1}^a\mu(d)\times \lfloor\dfrac ad\rfloor\times \lfloor\dfrac bd\rfloor\times \lfloor\dfrac cd\rfloor d=1∑aμ(d)×⌊da⌋×⌊db⌋×⌊dc⌋
预处理出 μ \mu μ函数即可,时间复杂度为 O ( a ) O(a) O(a)。
code
#include<bits/stdc++.h>
#define N 2000000
using namespace std;
int z[N+5],p[N+5],mu[N+5];
long long a,b,c,ans;
long long mod=1000000007;
void init(){
mu[1]=1;
for(int i=2;i<=N;i++){
if(!z[i]){
p[++p[0]]=i;mu[i]=-1;
}
for(int j=1;j<=p[0]&&i*p[j]<=N;j++){
z[i*p[j]]=1;
if(i%p[j]==0) break;
mu[i*p[j]]=-mu[i];
}
}
}
int main()
{
init();
scanf("%lld%lld%lld",&a,&b,&c);
if(b>c) swap(b,c);
if(a>b) swap(a,b);
if(b>c) swap(b,c);
for(int i=1;i<=a;i++){
ans=(ans+1ll*mu[i]*(a/i)%mod*(b/i)%mod*(c/i)%mod+mod)%mod;
}
printf("%lld",ans);
return 0;
}