Möbius Inversion tasks: Solution Set

· · 算法·理论

List of Möbius Inversion tasks

对这篇深度好文的拙略模仿。

如无特殊说明,本文中每道题的答案均记为 \mathrm{Ans}。

SP26017 GCDMAT - GCD OF MATRIX

GCDMAT

Formerly: \,\small\textbf{\textsf{\textcolor{9C3DCF}{省选/NOI−}}}

Now: \,\small\textbf{\textsf{\textcolor{3498DB}{提高+/省选−}}}

给定 a,b,c,d,求:

\left( \sum\limits_{i = a}^{c} \sum\limits_{j = b}^{d} \gcd(i,j) \right) \bmod (10^9 + 7).

多测,T 组数据,1 \le T \le 500,1 \le a,b,c,d \le 5 \times 10^4,a \le c,b \le d。

推导过程中忽略取模。

:::info[法一]{open}

设:

F(n,m) = \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \gcd(i,j).

则:

\mathrm{Ans} = F(c,d) - F(a-1,d) - F(c,b-1) + F(a-1,b-1).

考虑 F(n,m)。

显然 F(n,m) = F(m,n)。于是问题归约至 n \le m 的情形。

枚举 \gcd:

F(n,m) = \sum\limits_{k = 1}^{n} k \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \left[ \gcd(i,j) = k \right].

令 p = \dfrac{i}{k},q = \dfrac{j}{k}:

F(n,m) &= \sum\limits_{k = 1}^{n} k \sum\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{m}{k} \right\rfloor} \left[ \gcd(p,q) = 1 \right]\\ &= \sum\limits_{k = 1}^{n} k \sum\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{m}{k} \right\rfloor} \sum\limits_{d \mid \gcd(p,q)} \mu(d)\\ &= \sum\limits_{k = 1}^{n} k \sum\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{m}{k} \right\rfloor} \sum\limits_{\substack{d \mid p \\ d \mid q}} \mu(d)\\ &= \sum\limits_{k = 1}^{n} k \sum\limits_{d = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \mu(d) \sum\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} [d \mid p] \sum\limits_{q = 1}^{\left\lfloor \frac{m}{k} \right\rfloor} [d \mid q]\\ &= \sum\limits_{k = 1}^{n} k \sum\limits_{d = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \mu(d) \left\lfloor \frac{n}{kd} \right\rfloor \left\lfloor \frac{m}{kd} \right\rfloor. \end{aligned}

令 t = kd,则 d = \dfrac{t}{k}:

F(n,m) &= \sum\limits_{k = 1}^{n} k \sum\limits_{\substack{t = 1 \\ k \mid t}}^{n} \mu \left( \frac{t}{k} \right) \left\lfloor \frac{n}{t} \right\rfloor \left\lfloor \frac{m}{t} \right\rfloor\\ &= \sum\limits_{t = 1}^{n} \sum\limits_{k \mid t} k \cdot \mu \left( \frac{t}{k} \right) \left\lfloor \frac{n}{t} \right\rfloor \left\lfloor \frac{m}{t} \right\rfloor. \end{aligned}

由 \operatorname{id} * \,\mu = \varphi:

F(n,m) = \sum\limits_{t = 1}^{n} \varphi(t) \left\lfloor \frac{n}{t} \right\rfloor \left\lfloor \frac{m}{t} \right\rfloor.

:::

:::info[法二]{open}

考虑:

F(n,m) = \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \gcd(i,j).

由 \operatorname{id} = \varphi * \mathbf{1}:

F(n,m) &= \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \sum\limits_{d \mid \gcd(i,j)} \varphi(d)\\ &= \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \sum\limits_{\substack{d \mid i \\ d \mid j}} \varphi(d)\\ &= \sum\limits_{d = 1}^{n} \varphi(d) \sum\limits_{i = 1}^{n} [d \mid i] \sum\limits_{j = 1}^{m} [d \mid j]\\ &= \sum\limits_{d = 1}^{n} \varphi(d) \left\lfloor \frac{n}{d} \right\rfloor \left\lfloor \frac{m}{d} \right\rfloor. \end{aligned}

:::

预处理出 \varphi 的前缀和后数论分块即可。

设 n 与 a,b,c,d 同阶,则时间复杂度为 \mathcal{O}\left( n + T \sqrt{n} \right)。

:::info[Code]

#include<bits/stdc++.h>
#define int long long

const int N=5e4+10;

const int TT=1e9+7;

using namespace std;

int T;

int _n=5e4;

int a,b,c,d,ans;

int phi[N];

int cnt,p[N];

bool vis[N];

inline int read(){
    int ret=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')ret=ret*10+(ch&15),ch=getchar();
    return ret*f;
}

void _init(){
    phi[1]=1;
    for(int i=2;i<=_n;i++){
        if(!vis[i]){
            p[++cnt]=i;
            phi[i]=i-1;
        }
        for(int j=1;j<=cnt&&i*p[j]<=_n;j++){
            vis[i*p[j]]=1;
            if(i%p[j]){
                phi[i*p[j]]=phi[i]*(p[j]-1);
            }else{
                phi[i*p[j]]=phi[i]*p[j];
                break;
            }
        }
    }
    for(int i=1;i<=_n;i++)phi[i]=(phi[i]+phi[i-1])%TT;
}

int F(int n,int m){
    if(n>m)swap(n,m);
    int ret=0;
    for(int l=1,r;l<=n;l=r+1){
        r=min(n/(n/l),m/(m/l));
        ret+=((phi[r]-phi[l-1])%TT+TT)%TT*(n/l)%TT*(m/l)%TT;
        ret%=TT;
    }
    return ret;
}

void _solve(){
    a=read(),b=read(),c=read(),d=read();
    ans=F(c,d)-F(a-1,d)-F(c,b-1)+F(a-1,b-1);
    ans=(ans%TT+TT)%TT;
    printf("%lld\n",ans);
}

signed main(){
    _init();
    T=read();
    read(),read();
    while(T--)_solve();
    return 0;
}

:::

P1829 [集训队互测 2010] Crash的数字表格 / JZPTAB

JZPTAB

\small\textbf{\textsf{\textcolor{9C3DCF}{省选/NOI−}}}

给定 n,m,求:

\left( \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \operatorname{lcm}(i,j) \right) \bmod 20101009.

同样忽略取模,并将问题归约至 n \le m 的情形。

套路地推式子:

\mathrm{Ans} &= \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \frac{ij}{\gcd(i,j)}\\ &= \sum\limits_{k = 1}^{n} \frac{1}{k} \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} [\gcd(i,j)=k] ij\\ &= \sum\limits_{k = 1}^{n} \frac{1}{k} \sum\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{m}{k} \right\rfloor} [\gcd(p,q)=1] k^2 pq\\ &= \sum\limits_{k = 1}^{n} k \sum\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{m}{k} \right\rfloor} pq \sum\limits_{d \mid \gcd(p,q)} \mu(d)\\ &= \sum\limits_{k = 1}^{n} k \sum\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{m}{k} \right\rfloor} pq \sum\limits_{\substack{d \mid p \\d \mid q}} \mu(d)\\ &= \sum\limits_{k = 1}^{n} k \sum\limits_{d = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \mu(d) \sum\limits_{\substack{p = 1 \\ d \mid p}}^{\left\lfloor \frac{n}{k} \right\rfloor} p \sum\limits_{\substack{q = 1 \\ d \mid q}}^{\left\lfloor \frac{m}{k} \right\rfloor} q. \end{aligned}

令 p = ud,q = vd:

\mathrm{Ans} &= \sum\limits_{k = 1}^{n} k \sum\limits_{d = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \mu(d) \sum\limits_{u = 1}^{\left\lfloor \frac{n}{kd} \right\rfloor} ud \sum\limits_{v = 1}^{\left\lfloor \frac{m}{kd} \right\rfloor} vd\\ &= \sum\limits_{k = 1}^{n} k \sum\limits_{d = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} d^2 \mu(d) \sum\limits_{u = 1}^{\left\lfloor \frac{n}{kd} \right\rfloor} u \sum\limits_{v = 1}^{\left\lfloor \frac{m}{kd} \right\rfloor} v. \end{aligned}

令 G(n) = \displaystyle{\sum\limits_{i = 1}^{n} i} = \dfrac{n (n + 1)}{2}:

\mathrm{Ans} = \sum\limits_{k = 1}^{n} k \sum\limits_{d = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} d^2 \mu(d) G\left( \left\lfloor \frac{n}{kd} \right\rfloor \right) G\left( \left\lfloor \frac{m}{kd} \right\rfloor \right).

套路地,令 t = kd:

\mathrm{Ans} &= \sum\limits_{k = 1}^{n} k \sum\limits_{\substack{t = 1 \\ k \mid t}}^{n} \left( \frac{t}{k} \right)^2 \mu \left( \frac{t}{k} \right) G\left( \left\lfloor \frac{n}{t} \right\rfloor \right) G\left( \left\lfloor \frac{m}{t} \right\rfloor \right)\\ &= \sum\limits_{t = 1}^{n} \sum\limits_{k \mid t} k \left( \frac{t}{k} \right)^2 \mu \left( \frac{t}{k} \right) G\left( \left\lfloor \frac{n}{t} \right\rfloor \right) G\left( \left\lfloor \frac{m}{t} \right\rfloor \right)\\ &= \sum\limits_{t = 1}^{n} \sum\limits_{d \mid t} \frac{t}{d} \cdot d^2 \mu(d) G\left( \left\lfloor \frac{n}{t} \right\rfloor \right) G\left( \left\lfloor \frac{m}{t} \right\rfloor \right)\\ &= \sum\limits_{t = 1}^{n} t \sum\limits_{d \mid t} d \cdot \mu (d) G\left( \left\lfloor \frac{n}{t} \right\rfloor \right) G\left( \left\lfloor \frac{m}{t} \right\rfloor \right).\\ \end{aligned}

令 F(n) = \displaystyle{\sum\limits_{d \mid n} d \cdot \mu(d)}:

\mathrm{Ans} = \sum\limits_{t = 1}^{n} t \cdot F(t) G\left( \left\lfloor \frac{n}{t} \right\rfloor \right) G\left( \left\lfloor \frac{m}{t} \right\rfloor \right).

显然 F 为积性函数。

线性筛出 F 并预处理出 t \cdot F(t) 的前缀和后数论分块即可。

时间复杂度(视 n,m 同阶):预处理 \mathcal{O}(n),数论分块 \mathcal{O}(\sqrt{n}),总复杂度 \mathcal{O}(n)。如果是多组数据的话可以做到 \mathcal{O}(n + T \sqrt{n})。

:::info[如何线性筛出 F?]{open}

考虑 F(p^c) 的取值,其中 p 为质数:

F(p^c) &= \sum\limits_{d \mid p^c} d \cdot \mu(d)\\ &= \sum\limits_{i = 0}^{c} p^i \cdot\mu(p^i)\\ &= 1 \cdot \mu(1) + p \cdot \mu(p)\\ &= -p + 1. \end{aligned}

考虑线性筛的过程。

设当前用 i 和 p_j 筛去了 x = i \cdot p_j。显然 \operatorname{lpf}(x) = p_j。

F(x) &= F(i) F(p_j)\\ &= F(i) \cdot (- p_j + 1). \end{aligned} F(x) &= F(k) F(p_j^{c + 1})\\ &= \frac{F(i)}{F(p_j^c)} \cdot F(p_j^{c + 1})\\ &= F(i). \end{aligned}

:::

:::info[Code]

#include<bits/stdc++.h>
#define int long long

const int N=1e7+10;

const int TT=20101009;

using namespace std;

int n,m,ans;

int F[N];

int cnt,p[N];

bool vis[N];

inline int read(){
    int ret=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')ret=ret*10+(ch&15),ch=getchar();
    return ret*f;
}

void _init(){
    F[1]=1;
    for(int i=2;i<=n;i++){
        if(!vis[i]){
            p[++cnt]=i;
            F[i]=-i+1;
        }
        for(int j=1;j<=cnt&&i*p[j]<=n;j++){
            vis[i*p[j]]=1;
            if(i%p[j]){
                F[i*p[j]]=F[i]*(-p[j]+1);
            }else{
                F[i*p[j]]=F[i];
                break;
            }
        }
    }
    for(int i=1;i<=n;i++)F[i]=((F[i]%TT+TT)%TT*i%TT+F[i-1])%TT;
}

int G(int n){
    return n*(n+1)/2%TT;
}

signed main(){
    n=read(),m=read();
    if(n>m)swap(n,m);
    _init();
    for(int l=1,r;l<=n;l=r+1){
        r=min(n/(n/l),m/(m/l));
        ans+=((F[r]-F[l-1])%TT+TT)%TT*G(n/l)%TT*G(m/l)%TT;
        ans%=TT;
    }
    printf("%lld\n",ans);
    return 0;
}

:::

P3911 最小公倍数之和

最小公倍数之和

Formerly: \,\small\textbf{\textsf{\textcolor{9C3DCF}{省选/NOI−}}}

Now: \,\small\textbf{\textsf{\textcolor{13C2C2}{提高}}}

给定一个长为 N 的序列 A_1 \sim A_N,求:

\sum\limits_{i = 1}^{N} \sum\limits_{j = 1}^{N} \operatorname{lcm}(A_i,A_j).

令 n = \max_{i=1}^{N} A_i:

\mathrm{Ans} &= \sum\limits_{i = 1}^{N} \sum\limits_{j = 1}^{N} \sum\limits_{x = 1}^{n} \sum\limits_{y = 1}^{n} [A_i = x] [A_j = y] \operatorname{lcm}(x,y)\\ &= \sum\limits_{x = 1}^{n} \sum\limits_{y = 1}^{n} \sum\limits_{i = 1}^{N} [A_i = x] \sum\limits_{j = 1}^{N} [A_j = y] \operatorname{lcm}(x,y). \end{aligned}

令 c(x) = \displaystyle{\sum\limits_{i = 1}^{N} [A_i = x]}:

\mathrm{Ans} &= \sum\limits_{x = 1}^{n} \sum\limits_{y = 1}^{n} c(x) c(y) \operatorname{lcm}(x,y)\\ &= \sum\limits_{x = 1}^{n} \sum\limits_{y = 1}^{n} c(x) c(y) \frac{xy}{\gcd(x,y)}\\ &= \sum\limits_{k = 1}^{n} \frac{1}{k} \sum\limits_{x = 1}^{n} \sum\limits_{y = 1}^{n} [\gcd(x,y) = k] c(x) c(y) xy\\ &= \sum\limits_{k = 1}^{n} \frac{1}{k} \sum\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} [\gcd(p,q) = 1] c(kp) c(kq) k^2 pq\\ &= \sum\limits_{k = 1}^{n} k \sum\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} c(kp) c(kq) pq \sum\limits_{d \mid \gcd(p,q)} \mu(d)\\ &= \sum\limits_{k = 1}^{n} k \sum\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} c(kp) c(kq) pq \sum\limits_{\substack{d \mid p \\d \mid q}} \mu(d)\\ &= \sum\limits_{k = 1}^{n} k \sum\limits_{d = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \mu(d) \sum\limits_{\substack{p = 1 \\ d \mid p}}^{\left\lfloor \frac{n}{k} \right\rfloor} p \cdot c(kp) \sum\limits_{\substack{q = 1 \\ d \mid q}}^{\left\lfloor \frac{n}{k} \right\rfloor} q \cdot c(kq)\\ &= \sum\limits_{k = 1}^{n} k \sum\limits_{d = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \mu(d) \sum\limits_{u = 1}^{\left\lfloor \frac{n}{kd} \right\rfloor} du \cdot c(kdu) \sum\limits_{v = 1}^{\left\lfloor \frac{n}{kd} \right\rfloor} dv \cdot c(kdv)\\ &= \sum\limits_{k = 1}^{n} k \sum\limits_{d = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} d^2 \mu(d) \sum\limits_{u = 1}^{\left\lfloor \frac{n}{kd} \right\rfloor} u \cdot c(kdu) \sum\limits_{v = 1}^{\left\lfloor \frac{n}{kd} \right\rfloor} v \cdot c(kdv)\\ &= \sum\limits_{k = 1}^{n} k \sum\limits_{\substack{t = 1 \\ k \mid t}}^{n} \left( \frac{t}{k} \right)^2 \mu \left( \frac{t}{k} \right) \sum\limits_{u = 1}^{\left\lfloor \frac{n}{t} \right\rfloor} u \cdot c(tu) \sum\limits_{v = 1}^{\left\lfloor \frac{n}{t} \right\rfloor} v \cdot c(tv). \end{aligned}

令 G(x) = \displaystyle{\sum\limits_{i = 1}^{\left\lfloor \frac{n}{x} \right\rfloor}i \cdot c(xi)}:

\mathrm{Ans} &= \sum\limits_{k = 1}^{n} k \sum\limits_{\substack{t = 1 \\ k \mid t}}^{n} \left( \frac{t}{k} \right)^2 \mu \left( \frac{t}{k} \right) \left( G(t) \right) ^2\\ &= \sum\limits_{t = 1}^{n} \sum\limits_{k \mid t} k \left( \frac{t}{k} \right)^2 \mu \left( \frac{t}{k} \right) \left( G(t) \right) ^2\\ &= \sum\limits_{t = 1}^{n} \sum\limits_{d \mid t} \frac{t}{d} \cdot d^2 \mu(d) \left( G(t) \right) ^2\\ &= \sum\limits_{t = 1}^{n} t \sum\limits_{d \mid t} d \cdot \mu(d) \left( G(t) \right) ^2. \end{aligned}

令 F(x) = \displaystyle{\sum\limits_{d \mid x} d \cdot \mu(d)}:

\mathrm{Ans} = \sum\limits_{t = 1}^{n} t \cdot F(t) \left( G(t) \right) ^2. 时间复杂度: $$\begin{aligned} T(n) &= \mathcal{O}(n) + \sum\limits_{i = 1}^{n} \mathcal{O} \left( \frac{n}{i} \right)\\ &= \mathcal{O} \left( \int_{1}^{n} \frac{n}{x}\, \mathrm{d} x \right)\\ &= \mathcal{O}(n \log n). \end{aligned}$$ :::info[Code] ```cpp line-numbers #include<bits/stdc++.h> #define int long long const int N=5e4+10; using namespace std; int n,ans; int c[N]; int F[N]; int cnt,p[N]; bool vis[N]; inline int read(){ int ret=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9')ret=ret*10+(ch&15),ch=getchar(); return ret*f; } void _init(){ F[1]=1; for(int i=2;i<=n;i++){ if(!vis[i]){ p[++cnt]=i; F[i]=-i+1; } for(int j=1;j<=cnt&&i*p[j]<=n;j++){ vis[i*p[j]]=1; if(i%p[j]){ F[i*p[j]]=F[i]*(-p[j]+1); }else{ F[i*p[j]]=F[i]; break; } } } } int G(int x){ int ret=0; for(int i=1;i<=n/x;i++)ret+=i*c[x*i]; return ret; } signed main(){ int _n=read(); while(_n--){ int x=read(); n=max(n,x); c[x]++; } _init(); for(int i=1;i<=n;i++){ int tmp=G(i); ans+=i*F[i]*tmp*tmp; } printf("%lld\n",ans); return 0; } ``` ::: ## P10636 BZOJ3518 点组计数 >[点组计数](https://www.luogu.com.cn/problem/P10636) > >$\small\textbf{\textsf{\textcolor{9C3DCF}{省选/NOI−}}}

给定 n,m,求 n \times m 的点阵中三点共线的无序三元组个数,答案对 10^9 + 7 取模。

推导过程中忽略取模。

首先同行同列的三元组个数为 \displaystyle{n \binom{m}{3} + m \binom{n}{3}}。

考虑斜率为正的情形。枚举两个端点的横纵坐标之差 i,j,选取端点的方案数为 (n - i)(m - j) ,选取中间点的方案数为 \gcd(i,j) - 1。由对称性,斜率为负时贡献相同,因此最终将斜率为正的贡献乘以 2 即可。

故有:

\mathrm{Ans} = n \binom{m}{3} + m \binom{n}{3} + 2 \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} (n - i)(m - j)\left( \gcd(i,j) - 1 \right).

其中:

& \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} (n - i)(m - j)\left( \gcd(i,j) - 1 \right)\\ =& \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} (n - i)(m - j) \gcd(i,j) - \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} (n - i)(m - j)\\ =& \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} (n - i)(m - j) \gcd(i,j) - \frac{n (n - 1)}{2} \cdot \frac{m (m - 1)}{2}. \end{aligned}

考虑 \displaystyle{\sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} (n - i)(m - j) \gcd(i,j)},设其为 F(n,m)。将问题归约至 n \le m,有:

F(n,m) &= \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} (n - i)(m - j) \gcd(i,j)\\ &= \sum\limits_{k = 1}^{n} k \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} [\gcd(i,j) = k] (n - i)(m - j)\\ &= \sum\limits_{k = 1}^{n} k \sum\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{m}{k} \right\rfloor} [\gcd(p,q) = 1] (n - kp)(m - kq)\\ &= \sum\limits_{k = 1}^{n} k \sum\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{m}{k} \right\rfloor} (n - kp)(m - kq) \sum\limits_{\substack{d \mid p \\ d \mid q}} \mu(d)\\ &= \sum\limits_{k = 1}^{n} k \sum\limits_{d = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \mu(d) \sum\limits_{\substack{p = 1 \\ d \mid p}}^{\left\lfloor \frac{n}{k} \right\rfloor} (n - kp) \sum\limits_{\substack{q = 1 \\ d \mid q}}^{\left\lfloor \frac{m}{k} \right\rfloor} (m - kq)\\ &= \sum\limits_{k = 1}^{n} k \sum\limits_{d = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \mu(d) \sum\limits_{u = 1}^{\left\lfloor \frac{n}{kd} \right\rfloor} (n - kdu) \sum\limits_{v = 1}^{\left\lfloor \frac{m}{kd} \right\rfloor} (m - kdv)\\ &= \sum\limits_{k = 1}^{n} k \sum\limits_{\substack{t = 1 \\ k \mid t}}^{n} \mu\left( \frac{t}{k} \right) \sum\limits_{u = 1}^{\left\lfloor \frac{n}{t} \right\rfloor} (n - tu) \sum\limits_{v = 1}^{\left\lfloor \frac{m}{t} \right\rfloor} (m - tv). \end{aligned}

令 G(n,x) = \displaystyle{\sum\limits_{i = 1}^{\left\lfloor \frac{n}{x} \right\rfloor} (n - xi) = n \left\lfloor \frac{n}{x} \right\rfloor - \frac{x \left\lfloor \frac{n}{x} \right\rfloor \left( \left\lfloor \frac{n}{x} \right\rfloor + 1 \right)}{2}}:

F(n,m) &= \sum\limits_{k = 1}^{n} k \sum\limits_{\substack{t = 1 \\ k \mid t}}^{n} \mu\left( \frac{t}{k} \right) G(n,t) G(m,t)\\ &= \sum\limits_{t = 1}^{n} \sum\limits_{k \mid t} k \cdot \mu\left( \frac{t}{k} \right) G(n,t) G(m,t)\\ &= \sum\limits_{t = 1}^{n} \varphi(t) G(n,t) G(m,t). \end{aligned}

线性筛出 \varphi 即可。

视 n,m 同阶,则时间复杂度为 \mathcal{O}(n)。

:::info[Code]

#include<bits/stdc++.h>
#define int long long

const int N=5e4+10;

const int TT=1e9+7;

using namespace std;

int n,m,ans;

int phi[N];

int cnt,p[N];

bool vis[N];

int fac[N],inv[N];

inline int read(){
    int ret=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')ret=ret*10+(ch&15),ch=getchar();
    return ret*f;
}

int qpow(int x,int y){
    x%=TT;
    int ret=1;
    while(y){
        if(y&1)ret=ret*x%TT;
        x=x*x%TT;
        y>>=1;
    }
    return ret;
}

void _init(){
    phi[1]=1;
    for(int i=2;i<=n;i++){
        if(!vis[i]){
            p[++cnt]=i;
            phi[i]=i-1;
        }
        for(int j=1;j<=cnt&&i*p[j]<=n;j++){
            vis[i*p[j]]=1;
            if(i%p[j]){
                phi[i*p[j]]=phi[i]*(p[j]-1);
            }else{
                phi[i*p[j]]=phi[i]*p[j];
                break;
            }
        }
    }
    fac[0]=inv[0]=1;
    for(int i=1;i<=m;i++)fac[i]=fac[i-1]*i%TT;
    inv[m]=qpow(fac[m],TT-2);
    for(int i=m-1;i>=1;i--)inv[i]=inv[i+1]*(i+1)%TT;
}

int C(int x,int y){
    if(x<y)return 0;
    return fac[x]*inv[y]%TT*inv[x-y]%TT;
}

int G(int n,int x){
    int _n=n/x;
    return ((n*_n%TT-x*_n%TT*(_n+1)%TT*qpow(2,TT-2)%TT)%TT+TT)%TT;
}

int F(int n,int m){
    int ret=0;
    for(int i=1;i<=n;i++)ret+=phi[i]*G(n,i)%TT*G(m,i)%TT,ret%=TT;
    return ret;
}

signed main(){
    n=read(),m=read();
    if(n>m)swap(n,m);
    _init();
    ans+=(n*C(m,3)%TT+m*C(n,3)%TT)%TT,ans%=TT;
    ans+=F(n,m)*2%TT,ans%=TT;
    ans-=n*(n-1)%TT*m%TT*(m-1)%TT*qpow(2,TT-2)%TT,ans=(ans+TT)%TT;
    printf("%lld\n",ans);
    return 0;
}

:::

P5221 Product

Product

\small\textbf{\textsf{\textcolor{9C3DCF}{省选/NOI−}}}

给定 n,求:

\left( \prod\limits_{i = 1}^{n} \prod\limits_{j = 1}^{n} \frac{\operatorname{lcm}(i,j)}{\gcd(i,j)} \right) \bmod 104857601.

推导过程中忽略取模。

:::info[法一]{open}

首先有:

\mathrm{Ans} = \prod\limits_{i = 1}^{n} \prod\limits_{j = 1}^{n} \frac{ij}{\left( \gcd(i,j) \right)^2}.

设:

F(n) = \prod\limits_{i = 1}^{n} \prod\limits_{j = 1}^{n} \gcd(i,j).

则:

\mathrm{Ans} = \frac{(n !)^{2n}}{\left( F(n) \right)^2}.

考虑 F(n):

F(n) &= \prod\limits_{k = 1}^{n} \prod\limits_{i = 1}^{n} \prod\limits_{j = 1}^{n} k \uparrow [\gcd(i,j) = k]\\ &= \prod\limits_{k = 1}^{n} \prod\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right \rfloor} \prod\limits_{q = 1}^{\left\lfloor \frac{n}{k} \right \rfloor} k \uparrow [\gcd(p,q) = 1]\\ &= \prod\limits_{k = 1}^{n} \prod\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right \rfloor} \prod\limits_{q = 1}^{\left\lfloor \frac{n}{k} \right \rfloor} k \uparrow \left( \sum\limits_{d \mid \gcd(p,q)} \mu(d) \right)\\ &= \prod\limits_{k = 1}^{n} \prod\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right \rfloor} \prod\limits_{q = 1}^{\left\lfloor \frac{n}{k} \right \rfloor} \prod\limits_{d \mid \gcd(p,q)} k \uparrow \mu(d)\\ &= \prod\limits_{k = 1}^{n} \prod\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right \rfloor} \prod\limits_{q = 1}^{\left\lfloor \frac{n}{k} \right \rfloor} \prod\limits_{\substack{d \mid p \\ d \mid q}} k \uparrow \mu(d)\\ &= \prod\limits_{k = 1}^{n} \prod\limits_{d = 1}^{\left\lfloor \frac{n}{k} \right \rfloor} \prod\limits_{\substack{p = 1 \\ d \mid p}}^{\left\lfloor \frac{n}{k} \right \rfloor} \prod\limits_{\substack{q = 1 \\ d \mid q}}^{\left\lfloor \frac{n}{k} \right \rfloor} k \uparrow \mu(d)\\ &= \prod\limits_{k = 1}^{n} \prod\limits_{d = 1}^{\left\lfloor \frac{n}{k} \right \rfloor} \prod\limits_{u = 1}^{\left\lfloor \frac{n}{kd} \right \rfloor} \prod\limits_{v = 1}^{\left\lfloor \frac{n}{kd} \right \rfloor} k \uparrow \mu(d)\\ &= \prod\limits_{k = 1}^{n} \prod\limits_{d = 1}^{\left\lfloor \frac{n}{k} \right \rfloor} k \uparrow \left( \mu(d) \left\lfloor \frac{n}{kd} \right\rfloor ^2 \right)\\ &= \prod\limits_{k = 1}^{n} \prod\limits_{\substack{t = 1 \\ k \mid t}}^{n} k \uparrow \left( \mu \left( \frac{t}{k} \right) \left\lfloor \frac{n}{t} \right\rfloor ^2 \right)\\ &= \prod\limits_{t = 1}^{n} \prod\limits_{k \mid t} k \uparrow \left( \mu \left( \frac{t}{k} \right) \left\lfloor \frac{n}{t} \right\rfloor ^2 \right)\\ &= \prod\limits_{t = 1}^{n} \left( \prod\limits_{k \mid t} k \uparrow \mu \left( \frac{t}{k} \right) \right) \uparrow \left( \left\lfloor \frac{n}{t} \right\rfloor ^2 \right). \end{aligned}

其中 a \uparrow b = a^b 为 Knuth 箭头。

令 G(n) = \displaystyle{\prod\limits_{k \mid n} k \uparrow \mu \left( \frac{n}{k} \right)}:

F(n) = \prod\limits_{t = 1}^{n} G(t) \uparrow \left( \left\lfloor \frac{n}{t} \right\rfloor ^2 \right).

考虑 G(n)。两边取对数,得:

\ln G(n) = \sum\limits_{k \mid n} \ln(k) \, \mu\left( \frac{n}{k} \right).

考虑满足 \displaystyle{\ln n = \sum\limits_{d \mid n} \Lambda(d)} 的数论函数 \Lambda(von Mangoldt 函数)。

由 \ln = \Lambda * \mathbf{1},有 \ln * \,\mu = \Lambda:

\ln G(n) = \Lambda(n) = \begin{cases}\ln p, & n = p^c, \, p \in \mathbb{P}, \, c \in \mathbb{N}_{+}, \\ 0, & \text{otherwise}.\end{cases}

其中 p \in \mathbb{P},c \in \mathbb{N}_{+}。

于是:

G(n) = \begin{cases}p, & n = p^c, \, p \in \mathbb{P}, \, c \in \mathbb{N}_{+}, \\ 1, & \text{otherwise}.\end{cases}

:::

:::info[法二]{open}

考虑:

F(n) = \prod\limits_{i = 1}^{n} \prod\limits_{j = 1}^{n} \gcd(i,j).

两边取对数:

\ln F(n) &= \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{n} \ln \gcd(i,j)\\ &= \sum\limits_{k = 1}^{n} \ln k \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{n} [\gcd(i,j) = k]\\ &= \sum\limits_{k = 1}^{n} \ln k \sum\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} [\gcd(p,q) = 1]\\ &= \sum\limits_{k = 1}^{n} \ln k \sum\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \sum\limits_{d \mid \gcd(p,q)} \mu(d)\\ &= \sum\limits_{k = 1}^{n} \ln k \sum\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \sum\limits_{\substack{d \mid p \\ d \mid q}} \mu(d)\\ &= \sum\limits_{k = 1}^{n} \ln k \sum\limits_{d = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \mu(d) \sum\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} [d \mid p] \sum\limits_{q = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} [d \mid q]\\ &= \sum\limits_{k = 1}^{n} \ln k \sum\limits_{d = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \mu(d) \left\lfloor \frac{n}{kd} \right\rfloor ^2\\ &= \sum\limits_{k = 1}^{n} \ln k \sum\limits_{\substack{t = 1 \\ k \mid t}}^{n} \mu \left( \frac{t}{k} \right) \left\lfloor \frac{n}{t} \right\rfloor ^2\\ &= \sum\limits_{t = 1}^{n} \sum\limits_{k \mid t} \ln(k) \mu \left( \frac{t}{k} \right) \left\lfloor \frac{n}{t} \right\rfloor ^2\\ &= \sum\limits_{t = 1}^{n} \Lambda(t) \left\lfloor \frac{n}{t} \right\rfloor ^2. \end{aligned}

于是:

F(n) = \prod\limits_{t = 1}^{n} G(t) \uparrow \left( \left\lfloor \frac{n}{t} \right\rfloor ^2 \right).

:::

:::info[法三]{open}

考虑:

\ln F(n) = \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{n} \ln \gcd(i,j).

由 \ln = \Lambda * \mathbf{1}:

\ln F(n) &= \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{n} \sum\limits_{d \mid \gcd(i,j)} \Lambda(d)\\ &= \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{n} \sum\limits_{\substack{d \mid i \\ d \mid j}} \Lambda(d)\\ &= \sum\limits_{d = 1}^{n} \Lambda(d) \sum\limits_{i = 1}^{n} [d \mid i] \sum\limits_{j = 1}^{n} [d \mid j]\\ &= \sum\limits_{d = 1}^{n} \Lambda(d) \left\lfloor \frac{n}{d} \right\rfloor ^2. \end{aligned}

:::

预处理出 G 的前缀积后数论分块即可。注意指数应对 104857600 取模。

时间复杂度:预处理 \mathcal{O}(n),数论分块 \mathcal{O}(\sqrt{n} \log n),总复杂度 \mathcal{O}(n)。如果是多组数据的话可以做到 \mathcal{O}(n + T \sqrt{n} \log n)。

:::info[Code]

#include<bits/stdc++.h>
#define int long long

const int N=1e6+10;

const int TT=104857601;

using namespace std;

int n,ans;

int cnt,p[N];

bool vis[N];

int G[N];

inline int read(){
    int ret=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')ret=ret*10+(ch&15),ch=getchar();
    return ret*f;
}

int qpow(int x,int y){
    x%=TT;
    int ret=1;
    while(y){
        if(y&1)ret=ret*x%TT;
        x=x*x%TT;
        y>>=1;
    }
    return ret;
}

void _init(){
    for(int i=2;i<=n;i++){
        if(!vis[i])p[++cnt]=i;
        for(int j=1;j<=cnt&&i*p[j]<=n;j++){
            vis[i*p[j]]=1;
            if(!(i%p[j]))break;
        }
    }
    for(int i=0;i<=n;i++)G[i]=1;
    for(int i=1;i<=cnt;i++)for(int j=p[i];j<=n;j*=p[i])G[j]=p[i];
    for(int i=1;i<=n;i++)G[i]=G[i]*G[i-1]%TT;
}

int F(int n){
    int ret=1;
    for(int l=1,r;l<=n;l=r+1){
        r=n/(n/l);
        int tmp=G[r]*qpow(G[l-1],TT-2)%TT;
        ret=ret*qpow(tmp,(n/l)*(n/l)%(TT-1))%TT;
    }
    return ret;
}

signed main(){
    n=read();
    _init();
    int fac=1;
    for(int i=1;i<=n;i++)fac=fac*i%TT;
    ans=qpow(fac,n*2);
    int tmp=F(n);
    ans=ans*qpow(tmp*tmp%TT,TT-2)%TT;
    printf("%lld\n",ans);
    return 0;
}

:::

P3327 [SDOI2015] 约数个数和

约数个数和

\small\textbf{\textsf{\textcolor{9C3DCF}{省选/NOI−}}}

给定 n,m,求:

\sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \sigma_0(ij).

多测,T 组数据,1 \le T,n,m \le 5 \times 10^4。

首先有一个结论:

\sigma_0(ij) = \sum\limits_{x \mid i} \sum\limits_{y \mid j} [\gcd(x,y) = 1].

:::info[证明]{open}

考虑等式左边。设:

i = \prod\limits_{p} p^{a_p}, \ j = \prod\limits_{p} p^{b_p}.

其中 p \in \mathbb{P},下同。

则:

ij = \prod\limits_{p} p^{a_p + b_p}.

于是:

\sigma_0(ij) = \prod\limits_{p} (a_p + b_p + 1).

考虑等式右边。设:

x = \prod\limits_{p} p^{c_p}, \ y = \prod\limits_{p} p^{d_p}.

对于每个 p,设合法的 (c_p,d_p) 对数为 f(p),而合法的 (x,y) 对数就等于各 f(p) 之积。故等式右边即为:

\prod\limits_{p} f(p).

考虑 c_p 与 d_p 的限制条件:

因此:

故:

f(p) = a_p + b_p + 1.

因此等式右边即为:

\prod\limits_{p} (a_p + b_p + 1).

证毕。

:::

设 n \le m。

:::info[法一]{open}

利用上面的结论推式子:

\mathrm{Ans} &= \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \sum\limits_{x \mid i} \sum\limits_{y \mid j} [\gcd(x,y) = 1]\\ &= \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \sum\limits_{x \mid i} \sum\limits_{y \mid j} \sum\limits_{d \mid \gcd(x,y)} \mu(d)\\ &= \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \sum\limits_{x \mid i} \sum\limits_{y \mid j} \sum\limits_{\substack{d \mid x \\ d \mid y}} \mu(d)\\ &= \sum\limits_{d = 1}^{n} \mu(d) \sum\limits_{\substack{x = 1 \\ d \mid x}}^{n} \sum\limits_{\substack{i = 1 \\ x \mid i}}^{n} \sum\limits_{\substack{y = 1 \\ d \mid y}}^{m} \sum\limits_{\substack{j = 1 \\ y \mid j}}^{m} 1\\ &= \sum\limits_{d = 1}^{n} \mu(d) \sum\limits_{\substack{x = 1 \\ d \mid x}}^{n} \left\lfloor \frac{n}{x} \right\rfloor \sum\limits_{\substack{y = 1 \\ d \mid y}}^{m} \left\lfloor \frac{m}{y} \right\rfloor\\ &= \sum\limits_{d = 1}^{n} \mu(d) \sum\limits_{u = 1}^{\left\lfloor \frac{n}{d} \right\rfloor} \left\lfloor \frac{n}{ud} \right\rfloor \sum\limits_{v = 1}^{\left\lfloor \frac{m}{d} \right\rfloor} \left\lfloor \frac{m}{vd} \right\rfloor\\ &= \sum\limits_{d = 1}^{n} \mu(d) \sum\limits_{u = 1}^{\left\lfloor \frac{n}{d} \right\rfloor} \left\lfloor \frac{\left\lfloor \frac{n}{d} \right\rfloor}{u} \right\rfloor \sum\limits_{v = 1}^{\left\lfloor \frac{m}{d} \right\rfloor} \left\lfloor \frac{\left\lfloor \frac{m}{d} \right\rfloor}{v} \right\rfloor. \end{aligned}

设 S_0(n) = \displaystyle{\sum\limits_{i = 1}^{n} \left\lfloor \frac{n}{i} \right\rfloor} = \sum\limits_{i = 1}^{n} \sigma_0(i):

\mathrm{Ans} = \sum\limits_{d = 1}^{n} \mu(d) S_0 \left( \left\lfloor \frac{n}{d} \right\rfloor \right) S_0 \left( \left\lfloor \frac{m}{d} \right\rfloor \right).

:::

:::info[法二]{open}

先对关键结论进行变形:

\sigma_0(ij) &= \sum\limits_{x \mid i} \sum\limits_{y \mid j} [\gcd(x,y) = 1]\\ &= \sum\limits_{x \mid i} \sum\limits_{y \mid j} \sum\limits_{d \mid \gcd(x,y)} \mu(d)\\ &= \sum\limits_{x \mid i} \sum\limits_{y \mid j} \sum\limits_{\substack{d \mid x \\ d \mid y}} \mu(d)\\ &= \sum\limits_{\substack{d \mid i \\ d \mid j}} \mu(d) \sum\limits_{\substack{x \mid i \\ d \mid x}} \sum\limits_{\substack{y \mid j \\ d \mid y}} 1\\ &= \sum\limits_{\substack{d \mid i \\ d \mid j}} \mu(d) \sum\limits_{pd \mid i} \sum\limits_{qd \mid j} 1\\ &= \sum\limits_{\substack{d \mid i \\ d \mid j}} \mu(d) \sum\limits_{p \mid \frac{i}{d}} \sum\limits_{q \mid \frac{j}{d}} 1\\ &= \sum\limits_{\substack{d \mid i \\ d \mid j}} \mu(d) \sigma_0 \left( \frac{i}{d} \right) \sigma_0 \left( \frac{j}{d} \right). \end{aligned}

代入:

\mathrm{Ans} &= \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \sum\limits_{\substack{d \mid i \\ d \mid j}} \mu(d) \sigma_0 \left( \frac{i}{d} \right) \sigma_0 \left( \frac{j}{d} \right)\\ &= \sum\limits_{d = 1}^{n} \mu(d) \sum\limits_{\substack{i = 1 \\ d \mid i}}^{n} \sigma_0 \left( \frac{i}{d} \right) \sum\limits_{\substack{j = 1 \\ d \mid j}}^{m} \sigma_0 \left( \frac{j}{d} \right)\\ &= \sum\limits_{d = 1}^{n} \mu(d) \sum\limits_{p = 1}^{\left\lfloor \frac{n}{d} \right\rfloor} \sigma_0(p) \sum\limits_{q = 1}^{\left\lfloor \frac{m}{d} \right\rfloor} \sigma_0(q)\\ &= \sum\limits_{d = 1}^{n} \mu(d) S_0 \left( \left\lfloor \frac{n}{d} \right\rfloor \right) S_0 \left( \left\lfloor \frac{m}{d} \right\rfloor \right). \end{aligned}

:::

预处理出 \mu 的前缀和与 S_0 后数论分块即可。

视 n,m 同阶,则时间复杂度为 \mathcal{O}\left( n + T \sqrt{n} \right)。

:::info[Code]

#include<bits/stdc++.h>
#define int long long

const int N=5e4+10;

using namespace std;

int T;

int _n=5e4;

int n,m,ans;

int mu[N];

int tmp[N],sig_0[N];

int cnt,p[N];

bool vis[N];

inline int read(){
    int ret=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')ret=ret*10+(ch&15),ch=getchar();
    return ret*f;
}

void _init(){
    mu[1]=sig_0[1]=1;
    for(int i=2;i<=_n;i++){
        if(!vis[i]){
            p[++cnt]=i;
            mu[i]=-1;
            tmp[i]=sig_0[i]=2;
        }
        for(int j=1;j<=cnt&&i*p[j]<=_n;j++){
            vis[i*p[j]]=1;
            if(i%p[j]){
                mu[i*p[j]]=-mu[i];
                tmp[i*p[j]]=2;
                sig_0[i*p[j]]=sig_0[i]*2;
            }else{
                mu[i*p[j]]=0;
                tmp[i*p[j]]=tmp[i]+1;
                sig_0[i*p[j]]=sig_0[i]/tmp[i]*(tmp[i]+1);
                break;
            }
        }
    }
    for(int i=1;i<=_n;i++)mu[i]+=mu[i-1],sig_0[i]+=sig_0[i-1];
}

void _solve(){
    n=read(),m=read();
    ans=0;
    if(n>m)swap(n,m);
    for(int l=1,r;l<=n;l=r+1){
        r=min(n/(n/l),m/(m/l));
        ans+=(mu[r]-mu[l-1])*sig_0[n/l]*sig_0[m/l];
    }
    printf("%lld\n",ans);
}

signed main(){
    _init();
    T=read();
    while(T--)_solve();
    return 0;
}

:::

P4240 毒瘤之神的考验

毒瘤之神的考验

\small\textbf{\textsf{\textcolor{0E1D69}{NOI/NOI+/CTS}}}

给定 n,m,求:

\left( \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \varphi(ij) \right) \bmod 998244353.

多测,T 组数据,1 \le T \le 10^4,1 \le n,m \le 10^5。

首先有一个结论:

\varphi(ij) = \frac{\varphi(i) \varphi(j) \gcd(i,j)}{\varphi(\gcd(i,j))}.

:::info[证明]{open}

我们要证明的等式是:

\varphi(ij) \varphi(\gcd(i,j)) = \varphi(i) \varphi(j) \gcd(i,j).

左边为:

& \left( ij \prod\limits_{p \mid ij} \left( 1 - \frac{1}{p} \right) \right) \left( \gcd(i,j) \prod\limits_{p \mid \gcd(i,j)} \left( 1 - \frac{1}{p} \right) \right)\\ =& \left( ij \prod\limits_{p \mid i \ \lor \ p \mid j} \left( 1 - \frac{1}{p} \right) \right) \left( \gcd(i,j) \prod\limits_{p \mid i \ \land \ p \mid j} \left( 1 - \frac{1}{p} \right) \right)\\ =& \ ij \gcd(i,j) \left( \prod\limits_{p \mid i \ \lor \ p \mid j} \left( 1 - \frac{1}{p} \right) \right) \left( \prod\limits_{p \mid i \ \land \ p \mid j} \left( 1 - \frac{1}{p} \right) \right). \end{aligned}

其中 p \in \mathbb{P},下同。

右边为:

& \left( i \prod\limits_{p \mid i} \left( 1 - \frac{1}{p} \right) \right) \left( j \prod\limits_{p \mid j} \left( 1 - \frac{1}{p} \right) \right) \gcd(i,j)\\ =& \ ij \gcd(i,j) \left( \prod\limits_{p \mid i} \left( 1 - \frac{1}{p} \right) \right) \left( \prod\limits_{p \mid j} \left( 1 - \frac{1}{p} \right) \right). \end{aligned}

由容斥原理,两者相等。证毕。

:::

设 n \le m。推导中忽略取模。

复杂度分析中视 n,m 同阶。

利用上面的结论推式子:

\mathrm{Ans} &= \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \frac{\varphi(i) \varphi(j) \gcd(i,j)}{\varphi(\gcd(i,j))}\\ &= \sum\limits_{k = 1}^{n} \frac{k}{\varphi(k)} \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} [\gcd(i,j) = k] \varphi(i) \varphi(j)\\ &= \sum\limits_{k = 1}^{n} \frac{k}{\varphi(k)} \sum\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{m}{k} \right\rfloor} [\gcd(p,q) = 1] \varphi(kp) \varphi(kq)\\ &= \sum\limits_{k = 1}^{n} \frac{k}{\varphi(k)} \sum\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{m}{k} \right\rfloor} \varphi(kp) \varphi(kq) \sum\limits_{d \mid \gcd(p,q)} \mu(d)\\ &= \sum\limits_{k = 1}^{n} \frac{k}{\varphi(k)} \sum\limits_{p = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{m}{k} \right\rfloor} \varphi(kp) \varphi(kq) \sum\limits_{\substack{d \mid p \\ d \mid q}} \mu(d)\\ &= \sum\limits_{k = 1}^{n} \frac{k}{\varphi(k)} \sum\limits_{d = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \mu(d) \sum\limits_{\substack{p = 1 \\ d \mid p}}^{\left\lfloor \frac{n}{k} \right\rfloor} \varphi(kp) \sum\limits_{\substack{q = 1 \\ d \mid q}}^{\left\lfloor \frac{m}{k} \right\rfloor} \varphi(kq)\\ &= \sum\limits_{k = 1}^{n} \frac{k}{\varphi(k)} \sum\limits_{d = 1}^{\left\lfloor \frac{n}{k} \right\rfloor} \mu(d) \sum\limits_{u = 1}^{\left\lfloor \frac{n}{kd} \right\rfloor} \varphi(kdu) \sum\limits_{v = 1}^{\left\lfloor \frac{m}{kd} \right\rfloor} \varphi(kdv)\\ &= \sum\limits_{k = 1}^{n} \frac{k}{\varphi(k)} \sum\limits_{\substack{t = 1 \\ k \mid t}}^{n} \mu \left( \frac{t}{k} \right) \sum\limits_{u = 1}^{\left\lfloor \frac{n}{t} \right\rfloor} \varphi(tu) \sum\limits_{v = 1}^{\left\lfloor \frac{m}{t} \right\rfloor} \varphi(tv). \end{aligned}

令 G(x,y) = \displaystyle{\sum\limits_{i = 1}^{y} \varphi(xi)}:

\mathrm{Ans} &= \sum\limits_{k = 1}^{n} \frac{k}{\varphi(k)} \sum\limits_{\substack{t = 1 \\ k \mid t}}^{n} \mu \left( \frac{t}{k} \right) G \left( t, \left\lfloor \frac{n}{t} \right\rfloor \right) G \left( t, \left\lfloor \frac{m}{t} \right\rfloor \right)\\ &= \sum\limits_{t = 1}^{n} \sum\limits_{k \mid t} \frac{k}{\varphi(k)} \cdot \mu \left( \frac{t}{k} \right) G \left( t, \left\lfloor \frac{n}{t} \right\rfloor \right) G \left( t, \left\lfloor \frac{m}{t} \right\rfloor \right). \end{aligned}

令 F(x) = \displaystyle{ \sum\limits_{k \mid x} \frac{k}{\varphi(k)} \cdot \mu \left( \frac{x}{k} \right)}:

\mathrm{Ans} = \sum\limits_{t = 1}^{n} F(t) G \left( t, \left\lfloor \frac{n}{t} \right\rfloor \right) G \left( t, \left\lfloor \frac{m}{t} \right\rfloor \right).

首先预处理出 i \in [1,m] 的 \varphi(i) 与 \dfrac{i}{\varphi(i)},复杂度 \mathcal{O(n \log n)}。

对于 F(x),用 Dirichlet 差分预处理。复杂度 \mathcal{O}(n \log \log n)。

对于 G(x,y),有递推式:

G(x,y) = G(x, y - 1) + \varphi(xy).

显然有 xy \le m。于是预处理 G(x,y) 的复杂度为 \mathcal{O(n \log n)}。

考虑数论分块。

设:

H(a,b,c) = \sum\limits_{i = 1}^{c} F(i) G(i, a) G(i, b).

则在数论分块中,块 [l,r] 的贡献可表示为:

H \left( \left\lfloor \frac{n}{r} \right\rfloor , \left\lfloor \frac{m}{r} \right\rfloor , r \right) - H \left( \left\lfloor \frac{n}{r} \right\rfloor , \left\lfloor \frac{m}{r} \right\rfloor , l - 1 \right).

考虑预处理出一部分 H(a,b,c)。

设置一个预处理阈值 B。

显然有 ac \le n 与 bc \le m。

对于所有 a \in [1, B], b \in [1, B],预处理出 H(a,b,1) \sim H \left( a,b, \min \left( \left\lfloor \dfrac{n}{a} \right\rfloor , \left\lfloor \dfrac{m}{b} \right\rfloor \right) \right)。

递推式:

H(a,b,c) = H(a, b, c - 1) + F(c) G(c,a) G(c,b).

预处理 H(a,b,c) 的复杂度为:

& \, \mathcal{O} \left( \sum\limits_{i = 1}^{B} \sum\limits_{j = 1}^{B} \min \left( \frac{n}{i} , \frac{n}{j} \right) \right)\\ =& \, \mathcal{O} \left( \sum\limits_{i = 1}^{B} \sum\limits_{j = 1}^{i} \frac{n}{i} \right)\\ =& \, \mathcal{O} \left( \sum\limits_{i = 1}^{B} i \cdot \frac{n}{i} \right)\\ =& \, \mathcal{O} \left( nB \right).\\ \end{aligned}

数论分块中,对于一个块 [l,r],若 \left\lfloor \dfrac{m}{r} \right\rfloor > B,则暴力计算这一块的贡献。

可以证明此时 r \le \left\lfloor \dfrac{m}{B + 1} \right\rfloor,故计算所有 \left\lfloor \dfrac{m}{r} \right\rfloor > B 的块的复杂度为 \mathcal{O} \left( \dfrac{n}{B} \right)。

若 \left\lfloor \dfrac{m}{r} \right\rfloor \le B,借助预处理好的 H 函数可直接得到该块贡献。

总复杂度为 \mathcal{O} \left( n \log n + nB + T \left( \sqrt{n} + \dfrac{n}{B} \right) \right)。

当 B = \Theta(\sqrt{T}) 时,复杂度为 \mathcal{O} \left( n \log n + n \sqrt{T} + T \sqrt{n} \right)。

:::info[Code]

#include<bits/stdc++.h>
#define int long long
#define vi vector<int>

const int N=1e5+10;

const int B=110;

const int TT=998244353;

using namespace std;

int T;

int _n=1e5;

int b;

int n,m,ans;

int phi[N];

int cnt,p[N];

bool vis[N];

int F[N];

vi G[N];

vi H[B][B];

inline int read(){
    int ret=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')ret=ret*10+(ch&15),ch=getchar();
    return ret*f;
}

int qpow(int x,int y){
    x%=TT;
    int ret=1;
    while(y){
        if(y&1)ret=ret*x%TT;
        x=x*x%TT;
        y>>=1;
    }
    return ret;
}

void _init(){
    phi[1]=1;
    for(int i=2;i<=_n;i++){
        if(!vis[i]){
            p[++cnt]=i;
            phi[i]=i-1;
        }
        for(int j=1;j<=cnt&&i*p[j]<=_n;j++){
            vis[i*p[j]]=1;
            if(i%p[j]){
                phi[i*p[j]]=phi[i]*(p[j]-1)%TT;
            }else{
                phi[i*p[j]]=phi[i]*p[j]%TT;
                break;
            }
        }
    }
    for(int i=1;i<=_n;i++)F[i]=i*qpow(phi[i],TT-2)%TT;
    for(int i=1;i<=cnt;i++)for(int j=_n/p[i];j>=1;j--)F[p[i]*j]=(F[p[i]*j]-F[j]+TT)%TT;
    for(int i=1;i<=_n;i++){
        G[i].resize(_n/i+10);
        for(int j=1;j<=_n/i;j++)G[i][j]=(G[i][j-1]+phi[i*j])%TT;
    }
    b=(int)sqrt(T);
    for(int i=1;i<=b;i++){
        for(int j=1;j<=b;j++){
            int siz=min(_n/i,_n/j);
            H[i][j].resize(siz+10);
            for(int k=1;k<=siz;k++)H[i][j][k]=(H[i][j][k-1]+F[k]*G[k][i]%TT*G[k][j]%TT)%TT;
        }
    }
}

void _solve(){
    n=read(),m=read();
    ans=0;
    if(n>m)swap(n,m);
    for(int l=1,r;l<=n;l=r+1){
        r=min(n/(n/l),m/(m/l));
        if(m/r>b)for(int i=l;i<=r;i++)ans=(ans+F[i]*G[i][n/i]%TT*G[i][m/i]%TT)%TT;
        else ans=(ans+H[n/r][m/r][r]-H[n/r][m/r][l-1]+TT)%TT;
    }
    printf("%lld\n",ans);
}

signed main(){
    T=read();
    _init();
    while(T--)_solve();
    return 0;
}

:::

P13645 Totient with Divisors

Totient with Divisors

\small\textbf{\textsf{\textcolor{0E1D69}{NOI/NOI+/CTS}}}

给定 n,m,求:

\left( \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \varphi(i) \varphi(j) \sigma_1(ij) \right) \bmod 998244353.

多测,T 组数据,1 \le T,n,m \le 10^5。

首先有一个结论:

\sigma_1(ij) = \sum\limits_{x \mid i} \sum\limits_{y \mid j} \frac{yi}{x} [\gcd(x,y) = 1].

:::info[证明]{open}

考虑等式左边。设:

i = \prod\limits_{p} p^{a_p}, \ j = \prod\limits_{p} p^{b_p}.

其中 p \in \mathbb{P},下同。

则:

ij = \prod\limits_{p} p^{a_p + b_p}.

于是:

\sigma_1(ij) = \prod\limits_{p} \left( \sum\limits_{k = 0}^{a_p + b_p} p^k \right).

考虑等式右边。设:

x = \prod\limits_{p} p^{c_p}, \ y = \prod\limits_{p} p^{d_p}.

则:

\frac{yi}{x} = \prod\limits_{p} p^{a_p -c_p + d_p}.

考虑 c_p 与 d_p 的限制条件:

因此等式右边为:

& \prod\limits_{p} \left( \sum\limits_{c_p = 0}^{a_p} \sum\limits_{d_p = 0}^{b_p} [c_p d_p = 0] p^{a_p - c_p + d_p} \right)\\ =& \prod\limits_{p} \left( p^{a_p} + \sum\limits_{c_p = 1}^{a_p} p^{a_p - c_p} + \sum\limits_{d_p = 1}^{b_p} p^{a_p + d_p} \right)\\ =& \prod\limits_{p} \left( p^{a_p} + \sum\limits_{k = 1}^{a_p - 1} p^k + \sum\limits_{k = a_p + 1}^{a_p + b_p} p^k \right)\\ =& \prod\limits_{p} \left( \sum\limits_{k = 0}^{a_p + b_p} p^k \right). \end{aligned}

证毕。

:::

设 n \le m。推导中忽略取模。

复杂度分析中视 n,m 同阶。

:::info[法一]{open}

利用上面的结论推式子:

\mathrm{Ans} &= \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \varphi(i) \varphi(j) \sum\limits_{x \mid i} \sum\limits_{y \mid j} \frac{yi}{x} [\gcd(x,y) = 1]\\ &= \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \varphi(i) \varphi(j) \sum\limits_{x \mid i} \sum\limits_{y \mid j} \frac{yi}{x} \sum\limits_{d \mid \gcd(x,y)} \mu(d)\\ &= \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \varphi(i) \varphi(j) \sum\limits_{x \mid i} \sum\limits_{y \mid j} \frac{yi}{x} \sum\limits_{\substack{d \mid x \\ d \mid y}} \mu(d)\\ &= \sum\limits_{d = 1}^{n} \mu(d) \sum\limits_{\substack{x = 1 \\ d \mid x}}^{n} \sum\limits_{\substack{i = 1 \\ x \mid i}}^{n} \frac{i}{x} \cdot \varphi(i) \sum\limits_{\substack{y = 1 \\ d \mid y}}^{m} \sum\limits_{\substack{j = 1 \\ y \mid j}}^{m} y \cdot \varphi(j)\\ &= \sum\limits_{d = 1}^{n} \mu(d) \sum\limits_{\substack{x = 1 \\ d \mid x}}^{n} \sum\limits_{p = 1}^{\left\lfloor \frac{n}{x} \right\rfloor} p \cdot \varphi(px) \sum\limits_{\substack{y = 1 \\ d \mid y}}^{m} \sum\limits_{q = 1}^{\left\lfloor \frac{m}{y} \right\rfloor} y \cdot \varphi(qy)\\ &= \sum\limits_{d = 1}^{n} \mu(d) \sum\limits_{u = 1}^{\left\lfloor \frac{n}{d} \right\rfloor} \sum\limits_{p = 1}^{\left\lfloor \frac{n}{du} \right\rfloor} p \cdot \varphi(pud) \sum\limits_{v = 1}^{\left\lfloor \frac{m}{d} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{m}{dv} \right\rfloor} vd \cdot \varphi(qvd)\\ &= \sum\limits_{d = 1}^{n} d \cdot \mu(d) \sum\limits_{u = 1}^{\left\lfloor \frac{n}{d} \right\rfloor} \sum\limits_{p = 1}^{\left\lfloor \frac{n}{du} \right\rfloor} p \cdot \varphi(pud) \sum\limits_{v = 1}^{\left\lfloor \frac{m}{d} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{m}{dv} \right\rfloor} v \cdot \varphi(qvd). \end{aligned}

其中:

& \sum\limits_{u = 1}^{\left\lfloor \frac{n}{d} \right\rfloor} \sum\limits_{p = 1}^{\left\lfloor \frac{n}{du} \right\rfloor} p \cdot \varphi(pud)\\ =& \sum\limits_{u = 1}^{\left\lfloor \frac{n}{d} \right\rfloor} \sum\limits_{\substack{k = 1 \\ u \mid k}}^{\left\lfloor \frac{n}{d} \right\rfloor} \frac{k}{u} \cdot \varphi(kd)\\ =& \sum\limits_{k = 1}^{\left\lfloor \frac{n}{d} \right\rfloor} \varphi(kd) \sum\limits_{u \mid k} \frac{k}{u}\\ =& \sum\limits_{k = 1}^{\left\lfloor \frac{n}{d} \right\rfloor} \varphi(kd) \sigma_1(k). \end{aligned}

同样地,有:

& \sum\limits_{v = 1}^{\left\lfloor \frac{m}{d} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{m}{dv} \right\rfloor} v \cdot \varphi(qvd)\\ =& \sum\limits_{v = 1}^{\left\lfloor \frac{m}{d} \right\rfloor} \sum\limits_{\substack{k = 1 \\ v \mid k}}^{\left\lfloor \frac{m}{d} \right\rfloor} v \cdot \varphi(kd)\\ =& \sum\limits_{k = 1}^{\left\lfloor \frac{m}{d} \right\rfloor} \varphi(kd) \sum\limits_{v \mid k} v\\ =& \sum\limits_{k = 1}^{\left\lfloor \frac{m}{d} \right\rfloor} \varphi(kd) \sigma_1(k). \end{aligned}

令 F(x) = x \cdot \mu(x),G(x,y) = \displaystyle{\sum\limits_{i = 1}^{y}} \varphi(xi) \sigma_1(i):

\mathrm{Ans} = \sum\limits_{d = 1}^{n} F(d) G \left( d, \left\lfloor \frac{n}{d} \right\rfloor \right) G \left( d, \left\lfloor \frac{m}{d} \right\rfloor \right).

:::

:::info[法二]{open}

先对关键结论进行变形:

\sigma_1(ij) &= \sum\limits_{x \mid i} \sum\limits_{y \mid j} \frac{yi}{x} [\gcd(x,y) = 1]\\ &= \sum\limits_{x \mid i} \sum\limits_{y \mid j} \frac{yi}{x} \sum\limits_{d \mid \gcd(x,y)} \mu(d)\\ &= \sum\limits_{x \mid i} \sum\limits_{y \mid j} \frac{yi}{x} \sum\limits_{\substack{d \mid x \\ d \mid y}} \mu(d)\\ &= \sum\limits_{\substack{d \mid i \\ d \mid j}} \mu(d) \sum\limits_{\substack{x \mid i \\ d \mid x}} \frac{i}{x} \sum\limits_{\substack{y \mid j \\ d \mid y}} y\\ &= \sum\limits_{\substack{d \mid i \\ d \mid j}} \mu(d) \sum\limits_{pd \mid i} \frac{i}{pd} \sum\limits_{qd \mid j} qd\\ &= \sum\limits_{\substack{d \mid i \\ d \mid j}} d \cdot \mu(d) \sum\limits_{pd \mid i} \frac{i}{pd} \sum\limits_{qd \mid j} q\\ &= \sum\limits_{\substack{d \mid i \\ d \mid j}} d \cdot \mu(d) \sum\limits_{p \mid \frac{i}{d}} \frac{\,\frac{i}{d}\,}{p} \sum\limits_{q \mid \frac{j}{d}} q\\ &= \sum\limits_{\substack{d \mid i \\ d \mid j}} d \cdot \mu(d) \sigma_1 \left( \frac{i}{d} \right) \sigma_1 \left( \frac{j}{d} \right). \end{aligned}

代入:

\mathrm{Ans} &= \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \varphi(i) \varphi(j) \sum\limits_{\substack{d \mid i \\ d \mid j}} d \cdot \mu(d) \sigma_1 \left( \frac{i}{d} \right) \sigma_1 \left( \frac{j}{d} \right)\\ &= \sum\limits_{d = 1}^{n} d \cdot \mu(d) \sum\limits_{\substack{i = 1 \\ d \mid i}}^{n} \varphi(i) \sigma_1 \left( \frac{i}{d} \right) \sum\limits_{\substack{j = 1 \\ d \mid j}}^{m} \varphi(j) \sigma_1 \left( \frac{j}{d} \right)\\ &= \sum\limits_{d = 1}^{n} d \cdot \mu(d) \sum\limits_{p = 1}^{\left\lfloor \frac{n}{d} \right\rfloor} \varphi(dp) \sigma_1(p) \sum\limits_{q = 1}^{\left\lfloor \frac{m}{d} \right\rfloor} \varphi(dq) \sigma_1(q)\\ &= \sum\limits_{d = 1}^{n} F(d) G \left( d, \left\lfloor \frac{n}{d} \right\rfloor \right) G \left( d, \left\lfloor \frac{m}{d} \right\rfloor \right). \end{aligned}

:::

$$G(x,y) = G(x, y - 1) + \varphi(xy) \sigma_1(y).$$ 最终式子的结构与 P4240 一致。按 P4240 的做法做即可。 时间复杂度为 $\mathcal{O}(n \log n + n \sqrt{T} + T \sqrt{n})$。 :::info[Code] ```cpp line-numbers #include<bits/stdc++.h> #define ll long long #define vi vector<int> const int N=1e5+10; const int B=326; const int TT=998244353; using namespace std; int T; int _n=1e5; int b; int n,m,ans; int phi[N]; int mu[N]; int tmp[N],sig_1[N]; int cnt,p[N]; bool vis[N]; int F[N]; vi G[N]; vi H[B][B]; inline int read(){ int ret=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9')ret=ret*10+(ch&15),ch=getchar(); return ret*f; } void _init(){ phi[1]=mu[1]=sig_1[1]=1; for(int i=2;i<=_n;i++){ if(!vis[i]){ p[++cnt]=i; phi[i]=i-1; mu[i]=-1; tmp[i]=sig_1[i]=i+1; } for(int j=1;j<=cnt&&i*p[j]<=_n;j++){ vis[i*p[j]]=1; if(i%p[j]){ phi[i*p[j]]=phi[i]*(p[j]-1); mu[i*p[j]]=-mu[i]; tmp[i*p[j]]=p[j]+1; sig_1[i*p[j]]=sig_1[i]*(p[j]+1); }else{ phi[i*p[j]]=phi[i]*p[j]; mu[i*p[j]]=0; tmp[i*p[j]]=tmp[i]*p[j]+1; sig_1[i*p[j]]=sig_1[i]/tmp[i]*tmp[i*p[j]]; break; } } } for(int i=1;i<=_n;i++)phi[i]%=TT,mu[i]=(TT+mu[i])%TT,sig_1[i]%=TT; for(int i=1;i<=_n;i++)F[i]=(ll)i*mu[i]%TT; for(int i=1;i<=_n;i++){ G[i].resize(_n/i+10); for(int j=1;j<=_n/i;j++)G[i][j]=((ll)G[i][j-1]+(ll)phi[i*j]*sig_1[j]%TT)%TT; } b=(int)sqrt(T); for(int i=1;i<=b;i++){ for(int j=1;j<=b;j++){ int siz=min(_n/i,_n/j); H[i][j].resize(siz+10); for(int k=1;k<=siz;k++)H[i][j][k]=((ll)H[i][j][k-1]+(ll)F[k]*G[k][i]%TT*G[k][j]%TT)%TT; } } } void _solve(){ n=read(),m=read(); ans=0; if(n>m)swap(n,m); for(int l=1,r;l<=n;l=r+1){ r=min(n/(n/l),m/(m/l)); if(m/r>b)for(int i=l;i<=r;i++)ans=((ll)ans+(ll)F[i]*G[i][n/i]%TT*G[i][m/i]%TT)%TT; else ans=((ll)ans+H[n/r][m/r][r]-H[n/r][m/r][l-1]+TT)%TT; } printf("%d\n",ans); } signed main(){ T=read(); _init(); while(T--)_solve(); return 0; } ``` ::: ## P5518 [MtOI2019] 幽灵乐团 / 莫比乌斯反演基础练习题 >[幽灵乐团 / 莫比乌斯反演基础练习题](https://www.luogu.com.cn/problem/P5518) > > >Formerly: $\,\small\textbf{\textsf{\textcolor{0E1D69}{NOI/NOI+/CTS}}}

Now: \,\small\textbf{\textsf{\textcolor{9C3DCF}{省选/NOI−}}}

给定 A,B,C,p,求:

\left( \prod\limits_{i = 1}^{A} \prod\limits_{j = 1}^{B} \prod\limits_{k = 1}^{C} \left( \frac{\operatorname{lcm}(i,j)}{\gcd(i,k)} \right) ^{f(\mathrm{type})} \right) \bmod p.

其中:

\begin{cases} f(0) = 1,\\ f(1) = ijk,\\ f(2) = \gcd(i,j,k). \end{cases}

多测,T 组数据,T = 70,1 \le A,B,C \le 10^5,10^7 \le p \le 1.05 \times 10^9,p \in \mathbb{P}。所有数据共用一个 p。

推导过程中忽略取模。

复杂度分析中视 n 与 A,B,C 同阶。

首先有:

\mathrm{Ans}_{\mathrm{type}} &= \prod\limits_{i = 1}^{A} \prod\limits_{j = 1}^{B} \prod\limits_{k = 1}^{C} \left( \frac{ij}{\gcd(i,j) \gcd(i,k)} \right) ^{f(\mathrm{type})}\\ &= \frac{\left( \prod\limits_{i = 1}^{A} \prod\limits_{j = 1}^{B} \prod\limits_{k = 1}^{C} i^{f(\mathrm{type})} \right) \left( \prod\limits_{j = 1}^{B} \prod\limits_{i = 1}^{A} \prod\limits_{k = 1}^{C} j^{f(\mathrm{type})} \right)}{\left( \prod\limits_{i = 1}^{A} \prod\limits_{j = 1}^{B} \prod\limits_{k = 1}^{C} (\gcd(i,j))^{f(\mathrm{type})} \right) \left( \prod\limits_{i = 1}^{A} \prod\limits_{k = 1}^{C} \prod\limits_{j = 1}^{B} (\gcd(i,k))^{f(\mathrm{type})} \right)}. \end{aligned}

令:

F_{\mathrm{type},1}(A,B,C) &= \prod\limits_{i = 1}^{A} \prod\limits_{j = 1}^{B} \prod\limits_{k = 1}^{C} i^{f(\mathrm{type})},\\ F_{\mathrm{type},2}(A,B,C) &= \prod\limits_{i = 1}^{A} \prod\limits_{j = 1}^{B} \prod\limits_{k = 1}^{C} (\gcd(i,j))^{f(\mathrm{type})}. \end{aligned}

则:

\mathrm{Ans}_{\mathrm{type}} = \frac{F_{\mathrm{type},1}(A,B,C) \, F_{\mathrm{type},1}(B,A,C)}{F_{\mathrm{type},2}(A,B,C) \, F_{\mathrm{type},2}(A,C,B)}.

考虑 F_{0,1}(A,B,C):

F_{0,1}(A,B,C) = \prod\limits_{i = 1}^{A} \prod\limits_{j = 1}^{B} \prod\limits_{k = 1}^{C} i.

两边取对数:

\ln F_{0,1}(A,B,C) &= \sum\limits_{i = 1}^{A} \sum\limits_{j = 1}^{B} \sum\limits_{k = 1}^{C} \ln i\\ &= BC \sum\limits_{i = 1}^{A} \ln i. \end{aligned}

于是:

F_{0,1}(A,B,C) &= \left( \prod\limits_{i = 1}^{A} i \right) \uparrow (BC)\\ &= (A!) \uparrow (BC). \end{aligned}

预处理出阶乘数组后即可 \mathcal{O}(\log n) 求解。

考虑 F_{0,2}(A,B,C):

F_{0,2}(A,B,C) = \prod\limits_{i = 1}^{A} \prod\limits_{j = 1}^{B} \prod\limits_{k = 1}^{C} \gcd(i,j).

两边取对数:

\ln F_{0,2}(A,B,C) &= \sum\limits_{i = 1}^{A} \sum\limits_{j = 1}^{B} \sum\limits_{k = 1}^{C} \ln \gcd(i,j)\\ &= C \sum\limits_{i = 1}^{A} \sum\limits_{j = 1}^{B} \ln \gcd(i,j)\\ &= C \sum\limits_{i = 1}^{A} \sum\limits_{j = 1}^{B} \sum\limits_{d \mid \gcd(i,j)} \Lambda(d)\\ &= C \sum\limits_{i = 1}^{A} \sum\limits_{j = 1}^{B} \sum\limits_{\substack{d \mid i \\ d \mid j}} \Lambda(d)\\ &= C \sum\limits_{d = 1}^{\min(A,B)} \Lambda(d) \sum\limits_{i = 1}^{A} [d \mid i] \sum\limits_{j = 1}^{B} [d \mid j]\\ &= C \sum\limits_{d = 1}^{\min(A,B)} \Lambda(d) \left\lfloor \frac{A}{d} \right\rfloor \left\lfloor \frac{B}{d} \right\rfloor. \end{aligned}

于是:

F_{0,2}(A,B,C) = \left( \prod\limits_{d = 1}^{\min(A,B)} G(d) \uparrow \left( \left\lfloor \frac{A}{d} \right\rfloor \left\lfloor \frac{B}{d} \right\rfloor \right) \right) \uparrow C.

其中:

G(n) = \begin{cases}q, & n = q^c, \, q \in \mathbb{P}, \, c \in \mathbb{N}_{+}, \\ 1, & \text{otherwise}.\end{cases}

预处理出 G 的前缀积后数论分块即可,复杂度 \mathcal{O}(\sqrt{n} \log n)。

考虑 F_{1,1}(A,B,C):

F_{1,1}(A,B,C) = \prod\limits_{i = 1}^{A} \prod\limits_{j = 1}^{B} \prod\limits_{k = 1}^{C} i^{ijk}.

两边取对数:

\ln F_{1,1}(A,B,C) &= \sum\limits_{i = 1}^{A} \sum\limits_{j = 1}^{B} \sum\limits_{k = 1}^{C} ijk \ln i\\ &= \sum\limits_{j = 1}^{B} j \sum\limits_{k = 1}^{C} k \sum\limits_{i = 1}^{A} i \ln i\\ &= S(B) S(C) \sum\limits_{i = 1}^{A} i \ln i. \end{aligned}

其中 S(n) = \displaystyle{\sum\limits_{i = 1}^{n} i} = \displaystyle{\frac{n(n + 1)}{2}}。

于是:

F_{1,1}(A,B,C) = \left( \prod\limits_{i = 1}^{A} i^i \right) \uparrow \left( S(B) S(C) \right).

预处理出 \displaystyle{\prod\limits_{i = 1}^{n} i^i} 后即可 \mathcal{O}(\log n) 求解。

考虑 F_{1,2}(A,B,C):

F_{1,2}(A,B,C) = \prod\limits_{i = 1}^{A} \prod\limits_{j = 1}^{B} \prod\limits_{k = 1}^{C} (\gcd(i,j))^{ijk}.

两边取对数:

\ln F_{1,2}(A,B,C) &= \sum\limits_{i = 1}^{A} \sum\limits_{j = 1}^{B} \sum\limits_{k = 1}^{C} ijk \ln \gcd(i,j)\\ &= \sum\limits_{k = 1}^{C} k \sum\limits_{i = 1}^{A} \sum\limits_{j = 1}^{B} ij \ln(\gcd(i,j))\\ &= S(C) \sum\limits_{i = 1}^{A} \sum\limits_{j = 1}^{B} ij \sum\limits_{d \mid \gcd(i,j)} \Lambda(d)\\ &= S(C) \sum\limits_{i = 1}^{A} \sum\limits_{j = 1}^{B} ij \sum\limits_{\substack{d \mid i \\ d \mid j}} \Lambda(d)\\ &= S(C) \sum\limits_{d = 1}^{\min(A,B)} \Lambda(d) \sum\limits_{\substack{i = 1 \\ d \mid i}}^{A} i \sum\limits_{\substack{j = 1 \\ d \mid j}}^{B} j\\ &= S(C) \sum\limits_{d = 1}^{\min(A,B)} \Lambda(d) \sum\limits_{p = 1}^{\left\lfloor \frac{A}{d} \right\rfloor} dp \sum\limits_{q = 1}^{\left\lfloor \frac{B}{d} \right\rfloor} dq\\ &= S(C) \sum\limits_{d = 1}^{\min(A,B)} d^2 \Lambda(d) \sum\limits_{p = 1}^{\left\lfloor \frac{A}{d} \right\rfloor} p \sum\limits_{q = 1}^{\left\lfloor \frac{B}{d} \right\rfloor} q\\ &= S(C) \sum\limits_{d = 1}^{\min(A,B)} d^2 \Lambda(d) S \left( \left\lfloor \frac{A}{d} \right\rfloor \right) S \left( \left\lfloor \frac{B}{d} \right\rfloor \right). \end{aligned}

于是:

F_{1,2}(A,B,C) = \left( \prod\limits_{d = 1}^{\min(A,B)} \left( G(d) \uparrow \left( d^2 \right) \right) \uparrow\left( S \left( \left\lfloor \frac{A}{d} \right\rfloor \right) S \left( \left\lfloor \frac{B}{d} \right\rfloor \right) \right) \right) \uparrow S(C).

预处理出 G(n) \uparrow \left( n^2 \right) 的前缀积后数论分块即可,复杂度 \mathcal{O}(\sqrt{n} \log n)。

考虑 F_{2,1}(A,B,C):

F_{2,1}(A,B,C) = \prod\limits_{i = 1}^{A} \prod\limits_{j = 1}^{B} \prod\limits_{k = 1}^{C} i^{\gcd(i,j,k)}.

两边取对数:

\ln F_{2,1}(A,B,C) &= \sum\limits_{i = 1}^{A} \sum\limits_{j = 1}^{B} \sum\limits_{k = 1}^{C} \gcd(i,j,k) \ln i\\ &= \sum\limits_{i = 1}^{A} \sum\limits_{j = 1}^{B} \sum\limits_{k = 1}^{C} \ln i \sum\limits_{d \mid \gcd(i,j,k)} \varphi(d)\\ &= \sum\limits_{i = 1}^{A} \sum\limits_{j = 1}^{B} \sum\limits_{k = 1}^{C} \ln i \sum\limits_{\substack{d \mid i \\ d \mid j \\ d \mid k}} \varphi(d)\\ &= \sum\limits_{d = 1}^{\min(A,B,C)} \varphi(d) \sum\limits_{\substack{i = 1 \\ d \mid i}}^{A} \ln i \sum\limits_{j = 1}^{B} [d \mid j] \sum\limits_{k = 1}^{C} [d \mid k]\\ &= \sum\limits_{d = 1}^{\min(A,B,C)} \varphi(d) \sum\limits_{p = 1}^{\left\lfloor \frac{A}{d} \right\rfloor} \ln (dp) \left\lfloor \frac{B}{d} \right\rfloor \left\lfloor \frac{C}{d} \right\rfloor. \end{aligned}

于是:

F_{2,1}(A,B,C) &= \prod\limits_{d = 1}^{\min(A,B,C)} \prod\limits_{p = 1}^{\left\lfloor \frac{A}{d} \right\rfloor} (dp) \uparrow \left( \varphi(d) \left\lfloor \frac{B}{d} \right\rfloor \left\lfloor \frac{C}{d} \right\rfloor \right)\\ &= \prod\limits_{d = 1}^{\min(A,B,C)} \left( \left( d \uparrow \left\lfloor \frac{A}{d} \right\rfloor \right) \left( \left\lfloor \frac{A}{d} \right\rfloor ! \right) \right) \uparrow \left( \varphi(d) \left\lfloor \frac{B}{d} \right\rfloor \left\lfloor \frac{C}{d} \right\rfloor \right)\\ &= \prod\limits_{d = 1}^{\min(A,B,C)} \left( \left( d \uparrow \varphi(d) \right) \uparrow \left( \left\lfloor \frac{A}{d} \right\rfloor \left\lfloor \frac{B}{d} \right\rfloor \left\lfloor \frac{C}{d} \right\rfloor \right) \right) \left( \left( \left( \left\lfloor \frac{A}{d} \right\rfloor ! \right) \uparrow \left( \left\lfloor \frac{B}{d} \right\rfloor \left\lfloor \frac{C}{d} \right\rfloor \right) \right) \uparrow \varphi(d) \right)\\ &= \, H_0(A,B,C) \, H_1(A,B,C). \end{aligned}

其中:

H_0(A,B,C) &= \prod\limits_{d = 1}^{\min(A,B,C)} \left( d \uparrow \varphi(d) \right) \uparrow \left( \left\lfloor \frac{A}{d} \right\rfloor \left\lfloor \frac{B}{d} \right\rfloor \left\lfloor \frac{C}{d} \right\rfloor \right),\\ H_1(A,B,C) &= \prod\limits_{d = 1}^{\min(A,B,C)} \left( \left( \left\lfloor \frac{A}{d} \right\rfloor ! \right) \uparrow \left( \left\lfloor \frac{B}{d} \right\rfloor \left\lfloor \frac{C}{d} \right\rfloor \right) \right) \uparrow \varphi(d). \end{aligned}

考虑 F_{2,2}(A,B,C):

F_{2,2}(A,B,C) = \prod\limits_{i = 1}^{A} \prod\limits_{j = 1}^{B} \prod\limits_{k = 1}^{C} (\gcd(i,j))^{\gcd(i,j,k)}.

两边取对数:

\ln F_{2,2}(A,B,C) &= \sum\limits_{i = 1}^{A} \sum\limits_{j = 1}^{B} \sum\limits_{k = 1}^{C} \gcd(i,j,k) \ln \gcd(i,j)\\ &= \sum\limits_{d = 1}^{\min(A,B)} \ln d \sum\limits_{i = 1}^{A} \sum\limits_{j = 1}^{B} [\gcd(i,j) = d] \sum\limits_{k = 1}^{C} \gcd(d,k)\\ &= \sum\limits_{d = 1}^{\min(A,B)} \ln d \sum\limits_{p = 1}^{\left\lfloor \frac{A}{d} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{B}{d} \right\rfloor} [\gcd(p,q) = 1] \sum\limits_{k = 1}^{C} \gcd(d,k)\\ &= \sum\limits_{d = 1}^{\min(A,B)} \ln d \sum\limits_{p = 1}^{\left\lfloor \frac{A}{d} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{B}{d} \right\rfloor} \sum\limits_{t \mid \gcd(p,q)} \mu(t) \sum\limits_{k = 1}^{C} \gcd(d,k)\\ &= \sum\limits_{d = 1}^{\min(A,B)} \ln d \sum\limits_{p = 1}^{\left\lfloor \frac{A}{d} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{B}{d} \right\rfloor} \sum\limits_{\substack{t \mid p \\ t \mid q}} \mu(t) \sum\limits_{k = 1}^{C} \gcd(d,k)\\ &= \sum\limits_{d = 1}^{\min(A,B)} \ln d \sum\limits_{t = 1}^{\left\lfloor \frac{\min(A,B)}{d} \right\rfloor} \mu(t) \sum\limits_{p = 1}^{\left\lfloor \frac{A}{d} \right\rfloor} [t \mid p] \sum\limits_{q = 1}^{\left\lfloor \frac{B}{d} \right\rfloor} [t \mid q] \sum\limits_{k = 1}^{C} \gcd(d,k)\\ &= \sum\limits_{d = 1}^{\min(A,B)} \ln d \sum\limits_{t = 1}^{\left\lfloor \frac{\min(A,B)}{d} \right\rfloor} \mu(t) \left\lfloor \frac{A}{dt} \right\rfloor \left\lfloor \frac{B}{dt} \right\rfloor \sum\limits_{k = 1}^{C} \gcd(d,k)\\ &= \sum\limits_{d = 1}^{\min(A,B)} \ln d \sum\limits_{t = 1}^{\left\lfloor \frac{\min(A,B)}{d} \right\rfloor} \mu(t) \left\lfloor \frac{A}{dt} \right\rfloor \left\lfloor \frac{B}{dt} \right\rfloor \sum\limits_{k = 1}^{C} \sum\limits_{s \mid \gcd(d,k)} \varphi(s)\\ &= \sum\limits_{d = 1}^{\min(A,B)} \ln d \sum\limits_{t = 1}^{\left\lfloor \frac{\min(A,B)}{d} \right\rfloor} \mu(t) \left\lfloor \frac{A}{dt} \right\rfloor \left\lfloor \frac{B}{dt} \right\rfloor \sum\limits_{k = 1}^{C} \sum\limits_{\substack{s \mid d \\ s \mid k}} \varphi(s)\\ &= \sum\limits_{s = 1}^{\min(A,B,C)} \varphi(s) \sum\limits_{\substack{d = 1 \\ s \mid d}}^{\min(A,B)} \ln d \sum\limits_{t = 1}^{\left\lfloor \frac{\min(A,B)}{d} \right\rfloor} \mu(t) \left\lfloor \frac{A}{dt} \right\rfloor \left\lfloor \frac{B}{dt} \right\rfloor \sum\limits_{k = 1}^{C} [s \mid k]\\ &= \sum\limits_{s = 1}^{\min(A,B,C)} \varphi(s) \left\lfloor \frac{C}{s} \right\rfloor \sum\limits_{u = 1}^{\left\lfloor \frac{\min(A,B)}{s} \right\rfloor} \ln(su) \sum\limits_{t = 1}^{\left\lfloor \frac{\min(A,B)}{su} \right\rfloor} \mu(t) \left\lfloor \frac{A}{sut} \right\rfloor \left\lfloor \frac{B}{sut} \right\rfloor\\ &= \sum\limits_{s = 1}^{\min(A,B,C)} \varphi(s) \left\lfloor \frac{C}{s} \right\rfloor \sum\limits_{u = 1}^{\left\lfloor \frac{\min(A,B)}{s} \right\rfloor} \ln(su) \sum\limits_{\substack{\ell = 1 \\ u \mid \ell}}^{\left\lfloor \frac{\min(A,B)}{s} \right\rfloor} \mu\left( \frac{\ell}{u} \right) \left\lfloor \frac{A}{s \ell} \right\rfloor \left\lfloor \frac{B}{s \ell} \right\rfloor\\ &= \sum\limits_{s = 1}^{\min(A,B,C)} \varphi(s) \left\lfloor \frac{C}{s} \right\rfloor \sum\limits_{\ell = 1}^{\left\lfloor \frac{\min(A,B)}{s} \right\rfloor} \left\lfloor \frac{A}{s \ell} \right\rfloor \left\lfloor \frac{B}{s \ell} \right\rfloor \sum\limits_{u \mid \ell} \ln(su) \, \mu\left( \frac{\ell}{u} \right). \end{aligned}

于是:

F_{2,2}(A,B,C) = \prod\limits_{s = 1}^{\min(A,B,C)} \left( \prod\limits_{\ell = 1}^{\left\lfloor \frac{\min(A,B)}{s} \right\rfloor} \left( \prod\limits_{u \mid \ell} (su) \uparrow \, \mu\left( \frac{\ell}{u} \right) \right) \uparrow \left( \left\lfloor \frac{A}{s \ell} \right\rfloor \left\lfloor \frac{B}{s \ell} \right\rfloor \right) \right) \uparrow \left( \varphi(s) \left\lfloor \frac{C}{s} \right\rfloor \right).

考虑 \displaystyle{\prod\limits_{u \mid \ell} (su) \uparrow \, \mu\left( \frac{\ell}{u} \right)}:

\prod\limits_{u \mid \ell} (su) \uparrow \, \mu\left( \frac{\ell}{u} \right) &= \left( \prod\limits_{u \mid \ell} s \uparrow \, \mu\left( \frac{\ell}{u} \right) \right) \left( \prod\limits_{u \mid \ell} u \uparrow \, \mu\left( \frac{\ell}{u} \right) \right)\\ &= \left( s \uparrow \left( \sum\limits_{u \mid l} \mu\left( \frac{\ell}{u} \right) \right) \right) G(\ell)\\ &= \left( s \uparrow \varepsilon(\ell) \right) G(\ell). \end{aligned}

于是:

F_{2,2}(A,B,C) &= \prod\limits_{s = 1}^{\min(A,B,C)} \left( \prod\limits_{\ell = 1}^{\left\lfloor \frac{\min(A,B)}{s} \right\rfloor} \left( \left( s \uparrow \varepsilon(\ell) \right) G(\ell) \right) \uparrow \left( \left\lfloor \frac{A}{s \ell} \right\rfloor \left\lfloor \frac{B}{s \ell} \right\rfloor \right) \right) \uparrow \left( \varphi(s) \left\lfloor \frac{C}{s} \right\rfloor \right)\\ &= \prod\limits_{s = 1}^{\min(A,B,C)} \left( \left( s \uparrow \varphi(s) \right) \uparrow \left( \left\lfloor \frac{A}{s} \right\rfloor \left\lfloor \frac{B}{s} \right\rfloor \left\lfloor \frac{C}{s} \right\rfloor \right) \right) \left( \left( \left( \prod\limits_{\ell = 1}^{\left\lfloor \frac{\min(A,B)}{s} \right\rfloor} G(\ell) \uparrow \left( \left\lfloor \frac{A}{s \ell} \right\rfloor \left\lfloor \frac{B}{s \ell} \right\rfloor \right) \right) \uparrow \left\lfloor \frac{C}{s} \right\rfloor \right) \uparrow \varphi(s) \right)\\ &= \, H_0(A,B,C) \, H_2(A,B,C). \end{aligned}

其中:

H_2(A,B,C) &= \prod\limits_{s = 1}^{\min(A,B,C)} \left( \left( \prod\limits_{\ell = 1}^{\left\lfloor \frac{\min(A,B)}{s} \right\rfloor} G(\ell) \uparrow \left( \left\lfloor \frac{A}{s \ell} \right\rfloor \left\lfloor \frac{B}{s \ell} \right\rfloor \right) \right) \uparrow \left\lfloor \frac{C}{s} \right\rfloor \right) \uparrow \varphi(s)\\ &= \prod\limits_{s = 1}^{\min(A,B,C)} F_{0,2} \left( \left\lfloor \frac{A}{s} \right\rfloor , \left\lfloor \frac{B}{s} \right\rfloor , \left\lfloor \frac{C}{s} \right\rfloor \right) \uparrow \varphi(s). \end{aligned}

于是:

\mathrm{Ans}_{2} &= \frac{F_{2,1}(A,B,C) \, F_{2,1}(B,A,C)}{F_{2,2}(A,B,C) \, F_{2,2}(A,C,B)}\\ &= \frac{H_0(A,B,C) \, H_1(A,B,C) \, H_0(B,A,C) \, H_1(B,A,C)}{H_0(A,B,C) \, H_2(A,B,C) \, H_0(A,C,B) \, H_2(A,C,B)}\\ &= \frac{H_1(A,B,C) \, H_1(B,A,C)}{H_2(A,B,C) \, H_2(A,C,B)}. \end{aligned}

最后一步可以约分的原因是 H_0(A,B,C) 的值与 A,B,C 的顺序无关。

于是我们只需要求 H_1(A,B,C) 与 H_2(A,B,C)。

对于 H_1(A,B,C),预处理出 \varphi(n) 的前缀和后,数论分块即可。复杂度 \mathcal{O}(\sqrt{n} \log n)。

对于 H_2(A,B,C),预处理出 G(n) 的前缀积与 \varphi(n) 的前缀和后,两层数论分块即可。复杂度:

T(n) &= \sum\limits_{i = 1}^{\left\lfloor \sqrt{n} \right\rfloor} \mathcal{O} \left( \sqrt{i} \, \log n \right) + \sum\limits_{i = 1}^{\left\lfloor \sqrt{n} \right\rfloor} \mathcal{O} \left( \sqrt{\frac{n}{i}} \, \log n \right)\\ &= \mathcal{O} \left( \log n \int_{1}^{\sqrt{n}} \left( \sqrt{x} + \sqrt{\frac{n}{x}} \right) \, \mathrm{d} x \right)\\ &= \mathcal{O} \left( n^{\frac{3}{4}} \log n \right). \end{aligned}

我们需要预处理的有:

总复杂度为 \mathcal{O} \left( n \log n + T n^{\frac{3}{4}} \log n \right)。

:::info[Code]

#include<bits/stdc++.h>

const int N=1e5+10;

using namespace std;

int T;

int TT,TT1;

uint64_t inv,inv1;

int n=1e5;

int A,B,C;

int ans_0,ans_1,ans_2;

int phi[N];

int cnt,p[N];

bool vis[N];

int fac[N],h_fac[N];

int G[N],G_2[N];

inline int read(){
    int ret=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')ret=ret*10+(ch&15),ch=getchar();
    return ret*f;
}

namespace qmod{
    inline int _add(int x,int y){
        x+=y;
        return (x>=TT)?(x-TT):x;
    }
    inline int _sub(int x,int y){
        x-=y;
        return (x<0)?(x+TT):x;
    }
    inline int _reduce(int64_t x){
        uint64_t q=((__uint128_t)x*inv)>>64;
        x-=(int64_t)q*TT;
        return (int)((x>=TT)?(x-TT):x);
    }
    inline int _mul(int x,int y){
        return _reduce((int64_t)x*y);
    }
}

using namespace qmod;

namespace qmod1{
    inline int _add1(int x,int y){
        x+=y;
        return (x>=TT1)?(x-TT1):x;
    }
    inline int _sub1(int x,int y){
        x-=y;
        return (x<0)?(x+TT1):x;
    }
    inline int _reduce1(int64_t x){
        uint64_t q=((__uint128_t)x*inv1)>>64;
        x-=(int64_t)q*TT1;
        return (int)((x>=TT1)?(x-TT1):x);
    }
    inline int _mul1(int x,int y){
        return _reduce1((int64_t)x*y);
    }
}

using namespace qmod1;

int qpow(int x,int y){
    int ret=1;
    while(y){
        if(y&1)ret=_mul(ret,x);
        x=_mul(x,x);
        y>>=1;
    }
    return ret;
}

void _init(){
    phi[1]=1;
    for(int i=2;i<=n;i++){
        if(!vis[i]){
            p[++cnt]=i;
            phi[i]=i-1;
        }
        for(int j=1;j<=cnt&&i*p[j]<=n;j++){
            vis[i*p[j]]=1;
            if(i%p[j]){
                phi[i*p[j]]=phi[i]*(p[j]-1);
            }else{
                phi[i*p[j]]=phi[i]*p[j];
                break;
            }
        }
    }
    for(int i=1;i<=n;i++)phi[i]=_add1(phi[i],phi[i-1]);
    fac[0]=h_fac[0]=1;
    for(int i=1;i<=n;i++)fac[i]=_mul(fac[i-1],i),h_fac[i]=_mul(h_fac[i-1],qpow(i,i));
    for(int i=0;i<=n;i++)G[i]=1;
    G_2[0]=1;
    for(int i=1;i<=cnt;i++)for(int64_t j=p[i];j<=n;j*=p[i])G[j]=p[i];
    for(int i=1;i<=n;i++){
        G_2[i]=_mul(G_2[i-1],qpow(G[i],_mul1(i,i)));
        G[i]=_mul(G[i-1],G[i]);
    }
}

int S(int n){
    return _reduce1((int64_t)n*(n+1)/2);
}

int F_0_1(int A,int B,int C){
    return qpow(fac[A],_mul1(B,C));
}

int F_0_2(int A,int B,int C){
    int ret=1;
    int n=min(A,B);
    for(int l=1,r;l<=n;l=r+1){
        r=min(A/(A/l),B/(B/l));
        ret=_mul(ret,qpow(_mul(G[r],qpow(G[l-1],TT-2)),_mul1(A/l,B/l)));
    }
    ret=qpow(ret,C);
    return ret;
}

int F_1_1(int A,int B,int C){
    return qpow(h_fac[A],_mul1(S(B),S(C)));
}

int F_1_2(int A,int B,int C){
    int ret=1;
    int n=min(A,B);
    for(int l=1,r;l<=n;l=r+1){
        r=min(A/(A/l),B/(B/l));
        ret=_mul(ret,qpow(_mul(G_2[r],qpow(G_2[l-1],TT-2)),_mul1(S(A/l),S(B/l))));
    }
    ret=qpow(ret,S(C));
    return ret;
}

int H_1(int A,int B,int C){
    int ret=1;
    int n=min(A,min(B,C));
    for(int l=1,r;l<=n;l=r+1){
        r=min(A/(A/l),min(B/(B/l),C/(C/l)));
        ret=_mul(ret,qpow(qpow(fac[A/l],_mul1(B/l,C/l)),_sub1(phi[r],phi[l-1])));
    }
    return ret;
}

int H_2(int A,int B,int C){
    int ret=1;
    int n=min(A,min(B,C));
    for(int l=1,r;l<=n;l=r+1){
        r=min(A/(A/l),min(B/(B/l),C/(C/l)));
        ret=_mul(ret,qpow(F_0_2(A/l,B/l,C/l),_sub1(phi[r],phi[l-1])));
    }
    return ret;
}

void _solve(){
    A=read(),B=read(),C=read();
    ans_0=ans_1=ans_2=1;
    ans_0=_mul(ans_0,F_0_1(A,B,C));
    ans_0=_mul(ans_0,F_0_1(B,A,C));
    ans_0=_mul(ans_0,qpow(F_0_2(A,B,C),TT-2));
    ans_0=_mul(ans_0,qpow(F_0_2(A,C,B),TT-2));
    ans_1=_mul(ans_1,F_1_1(A,B,C));
    ans_1=_mul(ans_1,F_1_1(B,A,C));
    ans_1=_mul(ans_1,qpow(F_1_2(A,B,C),TT-2));
    ans_1=_mul(ans_1,qpow(F_1_2(A,C,B),TT-2));
    ans_2=_mul(ans_2,H_1(A,B,C));
    ans_2=_mul(ans_2,H_1(B,A,C));
    ans_2=_mul(ans_2,qpow(H_2(A,B,C),TT-2));
    ans_2=_mul(ans_2,qpow(H_2(A,C,B),TT-2));
    printf("%d %d %d\n",ans_0,ans_1,ans_2);
}

signed main(){
    T=read(),TT=read();
    TT1=TT-1;
    inv=(uint64_t)(-TT)/TT+1;
    inv1=(uint64_t)(-TT1)/TT1+1;
    _init();
    while(T--)_solve();
    return 0;
}

:::

P8570 [JRKSJ R6] 牵连的世界

牵连的世界

\small\textbf{\textsf{\textcolor{0E1D69}{NOI/NOI+/CTS}}}

给定 n,m,求:

\left( \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \sigma_0(ij) \varphi(ij) \right) \bmod (10^9 + 7).

设 n \le m。推导中忽略取模。

复杂度分析中视 n,m 同阶。

利用经典结论拆 \sigma_0(ij) 与 \varphi(ij):

\mathrm{Ans} &= \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} \frac{\varphi(i) \varphi(j) \gcd(i,j)}{\varphi(\gcd(i,j))} \sum\limits_{\substack{d \mid i \\ d \mid j}} \mu(d) \sigma_0 \left( \frac{i}{d} \right) \sigma_0 \left( \frac{j}{d} \right)\\ &= \sum\limits_{d = 1}^{n} \mu(d) \sum\limits_{\substack{i = 1 \\ d \mid i}}^{n} \sum\limits_{\substack{j = 1 \\ d \mid j}}^{m} \frac{\varphi(i) \varphi(j) \gcd(i,j)}{\varphi(\gcd(i,j))} \sigma_0 \left( \frac{i}{d} \right) \sigma_0 \left( \frac{j}{d} \right)\\ &= \sum\limits_{d = 1}^{n} \mu(d) \sum\limits_{p = 1}^{\left\lfloor \frac{n}{d} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{m}{d} \right\rfloor} \frac{\varphi(dp) \varphi(dq) d \gcd(p,q)}{\varphi(d \gcd(p,q))} \sigma_0(p) \sigma_0(q)\\ &= \sum\limits_{d = 1}^{n} \mu(d) \sum\limits_{k = 1}^{\left\lfloor \frac{n}{d} \right\rfloor} \frac{dk}{\varphi(dk)} \sum\limits_{p = 1}^{\left\lfloor \frac{n}{d} \right\rfloor} \sum\limits_{q = 1}^{\left\lfloor \frac{m}{d} \right\rfloor} [\gcd(p,q) = k] \varphi(dp) \varphi(dq) \sigma_0(p) \sigma_0(q)\\ &= \sum\limits_{d = 1}^{n} \mu(d) \sum\limits_{k = 1}^{\left\lfloor \frac{n}{d} \right\rfloor} \frac{dk}{\varphi(dk)} \sum\limits_{u = 1}^{\left\lfloor \frac{n}{dk} \right\rfloor} \sum\limits_{v = 1}^{\left\lfloor \frac{m}{dk} \right\rfloor} [\gcd(u,v) = 1] \varphi(dku) \varphi(dkv) \sigma_0(ku) \sigma_0(kv)\\ &= \sum\limits_{d = 1}^{n} \mu(d) \sum\limits_{k = 1}^{\left\lfloor \frac{n}{d} \right\rfloor} \frac{dk}{\varphi(dk)} \sum\limits_{u = 1}^{\left\lfloor \frac{n}{dk} \right\rfloor} \sum\limits_{v = 1}^{\left\lfloor \frac{m}{dk} \right\rfloor} \varphi(dku) \varphi(dkv) \sigma_0(ku) \sigma_0(kv) \sum\limits_{t \mid \gcd(u,v)} \mu(t)\\ &= \sum\limits_{d = 1}^{n} \mu(d) \sum\limits_{k = 1}^{\left\lfloor \frac{n}{d} \right\rfloor} \frac{dk}{\varphi(dk)} \sum\limits_{u = 1}^{\left\lfloor \frac{n}{dk} \right\rfloor} \sum\limits_{v = 1}^{\left\lfloor \frac{m}{dk} \right\rfloor} \varphi(dku) \varphi(dkv) \sigma_0(ku) \sigma_0(kv) \sum\limits_{\substack{t \mid u \\ t \mid v}} \mu(t)\\ &= \sum\limits_{d = 1}^{n} \mu(d) \sum\limits_{k = 1}^{\left\lfloor \frac{n}{d} \right\rfloor} \frac{dk}{\varphi(dk)} \sum\limits_{t = 1}^{\left\lfloor \frac{n}{dk} \right\rfloor} \mu(t) \sum\limits_{\substack{u = 1 \\ t \mid u}}^{\left\lfloor \frac{n}{dk} \right\rfloor} \varphi(dku) \sigma_0(ku) \sum\limits_{\substack{v = 1 \\ t \mid v}}^{\left\lfloor \frac{m}{dk} \right\rfloor} \varphi(dkv) \sigma_0(kv)\\ &= \sum\limits_{d = 1}^{n} \mu(d) \sum\limits_{k = 1}^{\left\lfloor \frac{n}{d} \right\rfloor} \frac{dk}{\varphi(dk)} \sum\limits_{t = 1}^{\left\lfloor \frac{n}{dk} \right\rfloor} \mu(t) \sum\limits_{x = 1}^{\left\lfloor \frac{n}{dkt} \right\rfloor} \varphi(dktx) \sigma_0(ktx) \sum\limits_{y = 1}^{\left\lfloor \frac{m}{dkt} \right\rfloor} \varphi(dkty) \sigma_0(kty)\\ &= \sum\limits_{d = 1}^{n} \mu(d) \sum\limits_{\substack{\ell = 1 \\ d \mid \ell}}^{n} \frac{\ell}{\varphi(\ell)} \sum\limits_{t = 1}^{\left\lfloor \frac{n}{\ell} \right\rfloor} \mu(t) \sum\limits_{x = 1}^{\left\lfloor \frac{n}{\ell t} \right\rfloor} \varphi(\ell tx) \sigma_0 \left( \frac{\ell tx}{d} \right) \sum\limits_{y = 1}^{\left\lfloor \frac{m}{\ell t} \right\rfloor}\varphi(\ell ty) \sigma_0 \left( \frac{\ell ty}{d} \right)\\ &= \sum\limits_{d = 1}^{n} \mu(d) \sum\limits_{\substack{\ell = 1 \\ d \mid \ell}}^{n} \frac{\ell}{\varphi(\ell)} \sum\limits_{\substack{s = 1 \\ \ell \mid s}}^{n} \mu \left( \frac{s}{\ell} \right) \sum\limits_{x = 1}^{\left\lfloor \frac{n}{s} \right\rfloor} \varphi(sx) \sigma_0 \left( \frac{sx}{d} \right) \sum\limits_{y = 1}^{\left\lfloor \frac{m}{s} \right\rfloor} \varphi(sy) \sigma_0 \left( \frac{sy}{d} \right)\\ &= \sum\limits_{d = 1}^{n} \mu(d) \sum\limits_{\substack{\ell = 1 \\ d \mid \ell}}^{n} \frac{\ell}{\varphi(\ell)} \sum\limits_{\substack{s = 1 \\ \ell \mid s}}^{n} \mu \left( \frac{s}{\ell} \right) \sum\limits_{\substack{i = 1 \\ s \mid i}}^{n} \varphi(i) \sigma_0 \left( \frac{i}{d} \right) \sum\limits_{\substack{j = 1 \\ s \mid j}}^{m} \varphi(j) \sigma_0 \left( \frac{j}{d} \right). \end{aligned}

考虑对于每个 d,求出:

F(d) = \sum\limits_{\substack{\ell = 1 \\ d \mid \ell}}^{n} \frac{\ell}{\varphi(\ell)} \sum\limits_{\substack{s = 1 \\ \ell \mid s}}^{n} \mu \left( \frac{s}{\ell} \right) \sum\limits_{\substack{i = 1 \\ s \mid i}}^{n} \varphi(i) \sigma_0 \left( \frac{i}{d} \right) \sum\limits_{\substack{j = 1 \\ s \mid j}}^{m} \varphi(j) \sigma_0 \left( \frac{j}{d} \right).

设:

G_1(s,d) &= \sum\limits_{\substack{i = 1 \\ s \mid i}}^{n} \varphi(i) \sigma_0 \left( \frac{i}{d} \right),\\ G_2(s,d) &= \sum\limits_{\substack{j = 1 \\ s \mid j}}^{m} \varphi(j) \sigma_0 \left( \frac{j}{d} \right). \end{aligned}

考虑在 d 的倍数上做 Dirichlet 后缀和,分别求出所有 s \in [1,n] \, \land d \mid s 的 G_1(s,d) 与所有 s \in [1,m] \, \land d \mid s 的 G_2(s,d)。复杂度 \mathcal{O} \left( \dfrac{n}{d} \log \log \dfrac{n}{d} \right)。

于是:

F(d) = \sum\limits_{\substack{\ell = 1 \\ d \mid \ell}}^{n} \frac{\ell}{\varphi(\ell)} \sum\limits_{\substack{s = 1 \\ \ell \mid s}}^{n} \mu \left( \frac{s}{\ell} \right) G_1(s,d) G_2(s,d).

设:

H(\ell,d) = \sum\limits_{\substack{s = 1 \\ \ell \mid s}}^{n} \mu \left( \frac{s}{\ell} \right) G_1(s,d) G_2(s,d).

在 d 的倍数上做 Dirichlet 后缀差分,求出所有 \ell \in [1,n] \, \land \ell \mid s 的 H(\ell,d)。复杂度 \mathcal{O} \left( \dfrac{n}{d} \log \log \dfrac{n}{d} \right)。

于是:

F(d) = \sum\limits_{\substack{\ell = 1 \\ d \mid \ell}}^{n} \frac{\ell}{\varphi(\ell)} H(\ell,d).

预处理出 \dfrac{\ell}{\varphi(\ell)} 后,直接计算的复杂度为 \mathcal{O} \left( \dfrac{n}{d} \right)。

最终:

\mathrm{Ans} = \sum\limits_{d = 1}^{n} \mu(d) F(d).

时间复杂度:

T(n) &= \sum\limits_{d = 1}^{n} \mathcal{O} \left( \frac{n}{d} \log \log \frac{n}{d} \right)\\ &= \mathcal{O} \left( \log \log n \int_{1}^{n} \frac{n}{x}\, \mathrm{d} x \right)\\ &= \mathcal{O}(n \log n \log \log n). \end{aligned}

:::info[Code]

#include<bits/stdc++.h>

const int N=3e6+10;

const int TT=1e9+7;

const uint64_t inv=(uint64_t)(-TT)/TT+1;

using namespace std;

int n,m,ans;

int phi[N];

int mu[N];

int tmp[N],sig_0[N];

int cnt,p[N];

bool vis[N];

int _inv[N];

int id_phi[N];

int t_1[N],t_2[N];

inline int read(){
    int ret=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')ret=ret*10+(ch&15),ch=getchar();
    return ret*f;
}

namespace qmod{
    inline int _add(int x,int y){
        x+=y;
        return (x>=TT)?(x-TT):x;
    }
    inline int _sub(int x,int y){
        x-=y;
        return (x<0)?(x+TT):x;
    }
    inline int _reduce(int64_t x){
        uint64_t q=((__uint128_t)x*inv)>>64;
        x-=(int64_t)q*TT;
        return (int)((x>=TT)?(x-TT):x);
    }
    inline int _mul(int x,int y){
        return _reduce((int64_t)x*y);
    }
}

using namespace qmod;

void _init(){
    phi[1]=mu[1]=sig_0[1]=1;
    for(int i=2;i<=m;i++){
        if(!vis[i]){
            p[++cnt]=i;
            phi[i]=i-1;
            mu[i]=TT-1;
            tmp[i]=sig_0[i]=2;
        }
        for(int j=1;j<=cnt&&i*p[j]<=m;j++){
            vis[i*p[j]]=1;
            if(i%p[j]){
                phi[i*p[j]]=phi[i]*(p[j]-1);
                mu[i*p[j]]=_reduce(TT-mu[i]);
                tmp[i*p[j]]=2;
                sig_0[i*p[j]]=sig_0[i]*2;
            }else{
                phi[i*p[j]]=phi[i]*p[j];
                mu[i*p[j]]=0;
                tmp[i*p[j]]=tmp[i]+1;
                sig_0[i*p[j]]=sig_0[i]/tmp[i]*(tmp[i]+1);
                break;
            }
        }
    }
    _inv[1]=1;
    for(int i=2;i<=n;i++)_inv[i]=_mul(TT-TT/i,_inv[TT%i]);
    for(int i=1;i<=n;i++)id_phi[i]=_mul(i,_inv[phi[i]]);
}

int F(int d){
    int ret=0;
    int _n=n/d,_m=m/d;
    for(int i=1;i<=_n;i++)t_1[i]=_mul(phi[i*d],sig_0[i]);
    for(int i=1;i<=_m;i++)t_2[i]=_mul(phi[i*d],sig_0[i]);
    for(int i=1;i<=cnt&&p[i]<=_n;i++){
        int _p=p[i];
        for(int j=_n/_p;j>=1;j--){
            t_1[j]=_add(t_1[j],t_1[_p*j]);
        }
    }
    for(int i=1;i<=cnt&&p[i]<=_m;i++){
        int _p=p[i];
        for(int j=_m/_p;j>=1;j--){
            t_2[j]=_add(t_2[j],t_2[_p*j]);
        }
    }
    for(int i=1;i<=_n;i++)t_1[i]=_mul(t_1[i],t_2[i]);
    for(int i=1;i<=cnt&&p[i]<=_n;i++){
        int _p=p[i],_n_p=_n/_p;
        for(int j=1;j<=_n_p;j++){
            t_1[j]=_sub(t_1[j],t_1[_p*j]);
        }
    }
    for(int i=1;i<=_n;i++)ret=_add(ret,_mul(id_phi[i*d],t_1[i]));
    return ret;
}

signed main(){
    n=read(),m=read();
    if(n>m)swap(n,m);
    _init();
    for(int d=1;d<=n;d++)if(mu[d])ans=_add(ans,_mul(mu[d],F(d)));
    printf("%d\n",ans);
    return 0;
}

:::