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 \]

证明:

  1. 有平方因子无贡献,也就是原来的 d 有平方因子,乘上 j 后仍是 0。

  2. 无平方因子即使有贡献,那么 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);}
}
posted @ 2021-11-01 18:42  -zxb-  阅读(49)  评论(0编辑  收藏  举报