返回顶部

P5176 公约数

P5176 公约数

\[ans=\sum _{i=1}^{m} \sum _{j=1}^{m} \sum _{k=1}^{p}gcd(ij,jk,ik)\times gcd(i,j,k)\times(\frac{gcd(i,j)}{gcd(i,k)\times gcd(j,k))}+\frac{gcd(j,k)}{gcd(i,k)\times gcd(i,j)}+\frac{gcd(i,k)}{gcd(i,j)\times gcd(j,k)} ) \]

$\quad $ 《这东西一眼就是完全不可做的🌚》,首先解决一下 \(gcd(ij,ik,jk)\) 这个东西。

先对 \(i、j、k\) 三个数进行质因数分解:

\(i=\prod _{p \in prime}{p^{a_o}}\)
\(j=\prod _{p \in prime}{p^{b_o}}\)
\(k=\prod _{p \in prime}{p^{c_o}}\)

(其实上面加不加 \(p|i\) 的条件是无所谓的,指数为 \(0\) 即可)。

那么,\(gcd(ij,jk,ik)\) 可以表示为:

\[\prod _{p \in prime}{p^{min(a_o+b_o,b_o+c_o,a_o+c_o)}} \]

$\quad $ 可以发现,取最小值不用考虑顺序问题,那我们不妨设 \(\forall p,a_o \le b_o \le c_o\)
$\quad $ 那么 \(min(a_o+b_o,b_o+c_o,a_o+c_o)=min(a_o,b_o)+min(b_o,c_o)+min(a_o,c_o)-min(a_o,b_o,c_o)\)

$\quad $ 所以:

\begin{aligned}
gcd(ij,ik,jk)&=\prod _{p \in prime}p^{min(a_o,b_o)+min(b_o,c_o)+min(a_o,c_o)-min(a_o,b_o,c_o)}\\
&=\prod _{p\in prime}p^{min(a_o,b_o)}\prod _{p\in prime}p^{min(b_o,c_o)}\prod _{p\in prime}p^{min(a_o,c_o)}\prod _{p\in prime}p^{-min(a_o,b_o,c_o)}\\
&=\frac{gcd(i,j)gcd(j,k)gcd(i,k)}{gcd(i,j,k)}
\end{aligned}

$\quad $ 现在就可以继续化简答案了🌚。

\begin{aligned}
ans&=\sum _{i=1}^{m} \sum _{j=1}^{m} \sum _{k=1}^{p}gcd(ij,jk,ik)\times gcd(i,j,k)\times(\frac{gcd(i,j)}{gcd(i,k)\times gcd(j,k))}+\frac{gcd(j,k)}{gcd(i,k)\times gcd(i,j)}+\frac{gcd(i,k)}{gcd(i,j)\times gcd(j,k)} )\\
&=\sum _{i=1}^{n}\sum _{j=1}^{m}\sum _{k=1}^{p}{gcd ^2 (i,j)+gcd ^2(j,k)+gcd ^2(i,k)}\\
&=n \times \sum _{j=1}^{m}\sum _{k=1}^{p}gcd ^2(j,k)+m \times \sum _{i=1}^{n}\sum _{k=1}^{p}gcd ^2(i,k)+p \times \sum _{i=1}^{n}\sum _{j=1}^{m}gcd ^2(i,j)
\end{aligned}

$\quad $ 然后你就会发现这三个部分形式其实是一样的,所以我们可以抽出来 \(ansl=\sum _{i=1}^{n}\sum _{j=1}^{m}{gcd ^2(i,j)}\) 单独考虑(以下式子均认为 \(n \le m\) )。

那么:

\begin{aligned}
ansl&=\sum _{i=1}^{n}\sum _{j=1}^{m}{gcd ^2(i,j)}\\
&=\sum _{d=1}^{n} d ^2 {\sum _{i=1}^{n}\sum _{j=1}^{m}[gcd(i,j)=d]}\\
&=\sum _{d=1}^{n}d ^2 \sum _{i=1}^{\lfloor \frac{n}{d} \rfloor}\sum _{j=1}^{\lfloor \frac{m}{d} \rfloor}[gcd(i,j)=1]\\
&=\sum _{d=1}^{n}d ^2 \sum _{i=1}^{\lfloor \frac{n}{d} \rfloor}\sum _{j=1}^{\lfloor \frac{m}{d} \rfloor}\sum _{k|d}{\mu (k)}\\
&=\sum _{d=1}^{n}d ^2 \sum _{k=1}^{\lfloor \frac{n}{d} \rfloor}\mu (k) {\lfloor \frac{n}{dk} \rfloor \lfloor \frac{m}{dk} \rfloor}
\end{aligned}
$\quad $ 仍令 \(T=dk\)

\begin{aligned}
ansl&=\sum _{T=1}^{n}{\lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T} \rfloor}\sum _{d|T}{d ^2 \mu(\frac{T}{d})}\\
\end{aligned}

$\quad $ 后半部分维护前缀和即可,但是对于每个数对其倍数做贡献的维护是 \(O(nln(n))\) 的,\(2e7\) 根本超不过去(大概是 \(3.5s\) 左右,但是会 \(T\) )。

$\quad $ 要维护的部分是两个积性函数的积,《当然也是积性函数🌚》,考虑线性筛。

$\quad $ 令 \(h(x)=\sum _{d|x}d ^2 \mu(\frac{x}{d})\) ,当 \(x \in prime\) 的时候,计算可知 \(h(x)=x ^2 -1\) ,当两数 \(x、y\) 互质且 \(y \in prime\) 时, \(h(xy)=h(x)h(y)\) 。《然后线性筛即可》。

$\quad $ 当然也可以用杜教筛,但是我不会🌚。

$\quad $ 再数论分块一下,最终时间复杂度为 \(O(n+T \sqrt {n})\) 。就可以超过去了。

点击查看代码
#define yhl 0
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e7+10,p=1e9+7;
bool vis[N];
int t,prime[N],f[N],n,m,q,tot;
void init(){
    vis[1]=1;f[1]=1;
    for(int i=2;i<N;i++){
        if(!vis[i]){
            f[i]=(1ll*i*i%p-1+p)%p;
            prime[++tot]=i;
        }
        for(int j=1;j<=tot&&i*prime[j]<N;j++){
            vis[i*prime[j]]=1;
            if(i%prime[j])f[i*prime[j]]=1ll*f[i]*f[prime[j]]%p;
            else {f[i*prime[j]]=1ll*f[i]*(1ll*prime[j]*prime[j]%p)%p;break;}
        }
    }
    for(int i=1;i<N;i++)f[i]=(f[i]+f[i-1])%p;
}
int work(int n,int m){
    if(n>m)swap(n,m);
    int ans=yhl,r=yhl;
    for(int i=1;i<=n;i=r+1){
        r=min(n/(n/i),m/(m/i));
        ans=(ans+1ll*(1ll*(n/r)*(m/r)%p)*(f[r]-f[i-1]+p)%p)%p;
    }
    return ans;
}
signed main(){
    init();
    scanf("%lld",&t);
    while(t--){
        scanf("%lld%lld%lld",&n,&m,&q);
        int ans=(1ll*q*work(n,m)%p+1ll*n*work(m,q)%p+1ll*m*work(n,q)%p)%p;
        printf("%lld\n",(ans+p)%p);
    }
    return yhl;
}
posted @ 2024-08-18 10:53  无敌の暗黑魔王  阅读(18)  评论(0编辑  收藏  举报