P5176 公约数
P5176 公约数
\[\sum_{i=1}^n\sum_{j=1}^m\sum_{k=1}^p\gcd(i\cdot j,i\cdot k,j\cdot k)\times \gcd(i,j,k)\times \left(\frac{\gcd(i,j)}{\gcd(i,k)\times \gcd(j,k)}+\frac{\gcd(i,k)}{\gcd(i,j)\times \gcd(j,k)}+\frac{\gcd(j,k)}{\gcd(i,j)\times \gcd(i,k)}\right) \]
题目很简洁。。
看到上面这堆乱七八糟的东西就头疼,求解的第一步肯定是要化简。
考虑化简\(\gcd(i\cdot j,j\cdot k,i\cdot k)\)
\[\gcd(i\cdot j,j\cdot k,i\cdot k)=\frac{\gcd(i,j)\times \gcd(j,k)\times \gcd(i,k)}{\gcd(i,j,k)}
\]
证明:
对于某一质因数 p ,设 i,j,k 分别含有 a,b,c 个 p。
不妨设 \(a\leq b\leq c\)。
容易得到 \(\gcd(i,j)\) 含有 \(\min(a,b)\) 个 p。
那么 \(\gcd(i\cdot j,j\cdot k,i\cdot k)\) 含有 \(\min(a+b,b+c,a+c)\) 个 p。
\[\min(a+b,b+c,a+c)=\min(a+b)+\min(b+c)+\min(a+c)-\min(a,b,c)
\]
根据我的假设,上式显然成立。
那么对于每一个质因数 p 都会满足上式。
由唯一分解定理,该命题成立。
化简答案 ans
\[ans=\sum_{i=1}^n\sum_{j=1}^m\sum_{k=1}^p\frac{\gcd(i,j)\times \gcd(j,k)\times \gcd(i,k)}{\gcd(i,j,k)}\times \gcd(i,j,k)\times \left(\frac{\gcd(i,j)}{\gcd(i,k)\times \gcd(j,k)}+\frac{\gcd(i,k)}{\gcd(i,j)\times \gcd(j,k)}+\frac{\gcd(j,k)}{\gcd(i,j)\times \gcd(i,k)}\right)
\]
\[ans=\sum_{i=1}^n\sum_{j=1}^m\sum_{k=1}^p\gcd(i,j)^2+\gcd(j,k)^2+\gcd(i,k)^2
\]
观察到每一项 gcd 都是之于两维有关,另一维只影响出现次数,所以:
\[ans=p\times \sum_{i=1}^{n}\sum_{j=1}^{m}\gcd(i,j)^2+n\times \sum_{i=1}^{m}\sum_{j=1}^{p}\gcd(i,j)^2+m\times \sum_{i=1}^{n}\sum_{j=1}^{p}\gcd(i,j)^2
\]
然后问题就回到了莫比乌斯反演上,这是最经典的问题。
莫比乌斯反演
求ans,我们只需要求出 \(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\gcd(i,j)^2\)
\[\sum_{d=1}^{\min(n,m)}d^2\sum_{i=1}^{\left \lfloor \frac{n}{d}\right\rfloor}\sum_{j=1}^{\left \lfloor \frac{m}{d}\right\rfloor} \left [ \gcd(i,j)==1\right ]
\]
\[\sum_{d=1}^{\min(n,m)}d^2\sum_{i=1}^{\left \lfloor \frac{n}{d}\right\rfloor}\sum_{j=1}^{\left \lfloor \frac{m}{d}\right\rfloor}\sum_{x|i,x|j}\mu(x)
\]
\[\sum_{d=1}^{\min(n,m)}d^2\sum_{x=1}^{\min(\left \lfloor \frac{n}{d}\right\rfloor,\left \lfloor \frac{m}{d}\right\rfloor)}\mu(x)\times \left \lfloor \frac{n}{dx}\right\rfloor \times \left \lfloor \frac{m}{dx}\right\rfloor
\]
常用套路,令 \(dx=T\)。
\[\sum_{T=1}^{min(n,m)}\left \lfloor \frac{n}{T}\right\rfloor\times \left \lfloor \frac{m}{T}\right\rfloor\times \sum_{d|T}\mu(\frac{T}{d})\times d^2
\]
现在基本上可以数论分块了,我们只需要求出后面 \(\sum_{d|T}\mu(\frac{T}{d})\times d^2\) 的前缀和。
线性筛
令 \(f(T)=\sum_{d|T}\mu(\frac{T}{d})\times d^2\)。
显然 \(f\) 为积性函数。
考虑定义,\(f(1)=1,f(p)=p^2-1\) ( \(p\) 是质数 )
i,j互质:
\[f(i\times j)=f(i)\times f(j)
\]
i,j不互质:
\[f(i\times j)=f(i)\times j^2
\]
证明:
-
有平方因子无贡献,也就是原来的 d 有平方因子,乘上 j 后仍是 0。
-
无平方因子即使有贡献,那么 d 扩大 j 倍后贡献扩大平方倍。
现在可以在线性的时间内搞出\(f\),对于询问分块即可。
复杂度 \(\mathcal O(n+T\sqrt{n})\)。
#include<bits/stdc++.h>
#define int long long
#define mod 1000000007
#define N 20005000
using namespace std;
int n,m,p,T,ans,su[N],f[N],cnt;
bool bo[N];
inline void pre()
{ f[1]=1;
for(int i=2;i<=20000000;++i)
{ if(!bo[i])su[++cnt]=i,f[i]=i*i%mod-1;
for(int j=1;j<=cnt and su[j]*i<=20000000;++j)
{ bo[su[j]*i]=1;
if(i%su[j]==0){f[i*su[j]]=f[i]*su[j]%mod*su[j]%mod;break;}
else f[i*su[j]]=f[i]*f[su[j]]%mod;
}
}
for(int i=1;i<=20000000;++i)f[i]=(f[i]+f[i-1])%mod;
}
inline int solve(int n,int m)
{ int jie=min(n,m),res=0;
for(int l=1,r;l<=jie;l=r+1)
{ r=min(n/(n/l),m/(m/l));
res=(res+(n/l)*(m/l)%mod*((f[r]-f[l-1]+mod)%mod)%mod)%mod;
}
return res;
}
signed main()
{ scanf("%lld",&T);pre();
while(T--){scanf("%lld%lld%lld",&n,&m,&p);printf("%lld\n",(n*solve(m,p)%mod+m*solve(n,p)%mod+p*solve(n,m)%mod)%mod);}
}