莫比乌斯反演例题

欢迎访问本菜鸡的独立博客:Codecho

UPDATED on Apr . 22 , 2019 ​ \text{Apr}. 22, 2019​ Apr.22,2019.

0. 套路

( 1 ) (1) (1) [ n = 1 ] = ∑ d ∣ n μ ( d ) \left[ n=1 \right] =\sum_{d|n}{\mu \left( d \right)} [n=1]=dnμ(d)

( 2 ) (2) (2) ∑ i = 1 a ∑ j = 1 b [ gcd ( i , j ) = d ] = ∑ i = 1 ⌊ a d ⌋ ∑ j = 1 ⌊ b d ⌋ [ gcd ( i , j ) = 1 ] \sum_{i=1}^a{\sum_{j=1}^b{\left[ \text{gcd}\left( i,j \right) =d \right]}}=\sum_{i=1}^{\lfloor \frac{a}{d} \rfloor}{\sum_{j=1}^{\lfloor \frac{b}{d} \rfloor}{\left[ \text{gcd}\left( i,j \right) =1 \right]}} i=1aj=1b[gcd(i,j)=d]=i=1daj=1db[gcd(i,j)=1]

( 3 ) (3) (3) $\left[ d|\text{gcd}\left( i,j \right) \right] =\left[ d|i \right] \left[ d|j \right] $

( 4 ) (4) (4) ∑ i , j , . . . f ( i , j , . . . ) = ∑ k = 1 m a x v a l u e ∑ i , j , . . . [ f ( i , j , . . . ) = k ] ⋅ f ( i , j , . . . ) \sum_{i,j,...}{f\left( i,j,... \right)}=\sum_{k=1}^{maxvalue}{\sum_{i,j,...}{\left[ f\left( i,j,... \right) =k \right] \cdot f\left( i,j,... \right)}} i,j,...f(i,j,...)=k=1maxvaluei,j,...[f(i,j,...)=k]f(i,j,...)

( 5 ) (5) (5) l = k d l=kd l=kd,则 ∑ k = 1 n ∑ d = 1 ⌊ n k ⌋ f = ∑ l = 1 n ∑ k ∣ l f = ∑ l = 1 n ∑ d ∣ l f \sum_{k=1}^n{\sum_{d=1}^{\lfloor \frac{n}{k} \rfloor}{f}=}\sum_{l=1}^n{\sum_{k|l}{f}=}\sum_{l=1}^n{\sum_{d|l}{f}} k=1nd=1knf=l=1nklf=l=1ndlf,之后一般可推出一个积性函数乘上一些式子

( 6 ) (6) (6) ∑ d ∣ n 1 = ∑ d = 1 n [ d ∣ n ] \sum_{d|n}{1}=\sum_{d=1}^n{\left[ d|n \right]} dn1=d=1n[dn] 表示 [ 1 , n ] [1,n] [1,n] 范围内 d d d倍数个数

( 7 ) (7) (7) ∑ d ∣ n d = ∑ d = 1 n [ d ∣ n ] ⋅ d \sum_{d|n}{d}=\sum_{d=1}^n{\left[ d|n \right]}\cdot d dnd=d=1n[dn]d 表示 [ 1 , n ] [1,n] [1,n] 范围内 d d d倍数之和

1. BZOJ - 1101

1.1 题面

∑ i = 1 a ∑ j = 1 b [ gcd ( i , j ) = d ] \sum_{i=1}^a{\sum_{j=1}^b{\left[ \text{gcd}\left( i,j \right) =d \right]}} i=1aj=1b[gcd(i,j)=d] 的值。

数据范围: 1 ≤ d ≤ a , b ≤ 50000 1 \le d \le a, b \le 50000 1da,b50000,共 T ( 1 ≤ T ≤ 50000 ) T(1 \le T \le 50000) T(1T50000) 组数据。

1.2 解题过程

∑ i = 1 a ∑ j = 1 b [ gcd ( i , j ) = d ] = ∑ i = 1 ⌊ a d ⌋ ∑ j = 1 ⌊ b d ⌋ [ gcd ( i , j ) = 1 ] = ∑ i = 1 ⌊ a d ⌋ ∑ j = 1 ⌊ b d ⌋ ∑ d ′ ∣ gcd ( i , j ) μ ( d ′ ) = ∑ i = 1 ⌊ a d ⌋ ∑ j = 1 ⌊ b d ⌋ ∑ d ′ = 1 min ⁡ ( ⌊ a d ⌋ , ⌊ b d ⌋ ) [ d ′ ∣ gcd ( i , j ) ] μ ( d ) = ∑ i = 1 ⌊ a d ⌋ ∑ j = 1 ⌊ b d ⌋ ∑ d ′ = 1 min ⁡ ( ⌊ a d ⌋ , ⌊ b d ⌋ ) [ d ′ ∣ i ] [ d ′ ∣ j ] μ ( d ) = ∑ d ′ = 1 min ⁡ ( ⌊ a d ⌋ , ⌊ b d ⌋ ) μ ( d ) ⋅ ( ∑ i = 1 ⌊ a d ⌋ [ d ′ ∣ i ] ) ⋅ ( ∑ j = 1 ⌊ b d ⌋ [ d ′ ∣ j ] ) = ∑ d ′ = 1 min ⁡ ( ⌊ a d ⌋ , ⌊ b d ⌋ ) μ ( d ) ⌊ ⌊ a d ⌋ d ′ ⌋ ⌊ ⌊ b d ⌋ d ′ ⌋ \begin{aligned} &\sum_{i=1}^a{\sum_{j=1}^b{\left[ \text{gcd}\left( i,j \right) =d \right]}} \\ &=\sum_{i=1}^{\lfloor \frac{a}{d} \rfloor}{\sum_{j=1}^{\lfloor \frac{b}{d} \rfloor}{\left[ \text{gcd}\left( i,j \right) =1 \right]}} \\ &=\sum_{i=1}^{\lfloor \frac{a}{d} \rfloor}{\sum_{j=1}^{\lfloor \frac{b}{d} \rfloor}{\sum_{d'|\text{gcd}\left( i,j \right)}{\mu \left( d' \right)}}} \\ &=\sum_{i=1}^{\lfloor \frac{a}{d} \rfloor}{\sum_{j=1}^{\lfloor \frac{b}{d} \rfloor}{\sum_{d'=1}^{\min \left( \lfloor \frac{a}{d} \rfloor ,\lfloor \frac{b}{d} \rfloor \right)}{\left[ d'|\text{gcd}\left( i,j \right) \right]}}}\mu \left( d \right) \\ &=\sum_{i=1}^{\lfloor \frac{a}{d} \rfloor}{\sum_{j=1}^{\lfloor \frac{b}{d} \rfloor}{\sum_{d'=1}^{\min \left( \lfloor \frac{a}{d} \rfloor ,\lfloor \frac{b}{d} \rfloor \right)}{\left[ d'|i \right]}}}\left[ d'|j \right] \mu \left( d \right) \\ &=\sum_{d'=1}^{\min \left( \lfloor \frac{a}{d} \rfloor ,\lfloor \frac{b}{d} \rfloor \right)}{\mu \left( d \right) \cdot \left( \sum_{i=1}^{\lfloor \frac{a}{d} \rfloor}{\left[ d'|i \right]} \right)}\cdot \left( \sum_{j=1}^{\lfloor \frac{b}{d} \rfloor}{\left[ d'|j \right]} \right) \\ &=\sum_{d'=1}^{\min \left( \lfloor \frac{a}{d} \rfloor ,\lfloor \frac{b}{d} \rfloor \right)}{\mu \left( d \right) \lfloor \frac{\lfloor \frac{a}{d} \rfloor}{d'} \rfloor}\lfloor \frac{\lfloor \frac{b}{d} \rfloor}{d'} \rfloor \end{aligned} i=1aj=1b[gcd(i,j)=d]=i=1daj=1db[gcd(i,j)=1]=i=1daj=1dbdgcd(i,j)μ(d)=i=1daj=1dbd=1min(da,db)[dgcd(i,j)]μ(d)=i=1daj=1dbd=1min(da,db)[di][dj]μ(d)=d=1min(da,db)μ(d)i=1da[di]j=1db[dj]=d=1min(da,db)μ(d)ddaddb

1.3 优化技巧

本题需要分块,以达到 O ( T ⋅ ( a + b ) ) O(T \cdot (\sqrt a + \sqrt b)) O(T(a +b ))时间复杂度

分块代码如下:

int answer = 0;
int pos = 0, last = 0;
int p = a / d, q = b / d;
int minvalue = min(p, q);
while(pos + 1 <= minvalue)
{
    pos = min(p / (p / (pos + 1)), q / (q / (pos + 1)));
    answer += (prefix[pos] - prefix[last]) * (p / pos) * (q / pos);
    last = pos;
}

注意使用 long long 可能会被卡常数

2. BZOJ - 2301

2.1 题面

∑ i = a b ∑ j = c d [ gcd ( i , j ) = k ] \sum_{i=a}^{b} \sum_{j=c}^{d} [\text{gcd}(i,j)=k] i=abj=cd[gcd(i,j)=k] 的值。

数据范围: 1 ≤ n , k ≤ 5 ⋅ 1 0 4 1 \le n,k \le 5 \cdot 10^4 1n,k5104 1 ≤ a ≤ b ≤ 5 ⋅ 1 0 4 1 \le a \le b \le 5 \cdot 10^4 1ab5104 1 ≤ c ≤ d ≤ 5 ⋅ 1 0 4 ​ 1 \le c \le d \le 5 \cdot 10^4​ 1cd5104

2.2 解题过程

s u m ( a , b ) = ∑ i = 1 a ∑ j = 1 b [ gcd ( i , j ) = k ] sum(a,b)=\sum_{i=1}^{a} \sum_{j=1}^{b} [\text{gcd}(i,j)=k] sum(a,b)=i=1aj=1b[gcd(i,j)=k] ,则答案为二维前缀和
s u m ( b , d ) − s u m ( a − 1 , d ) − s u m ( b , c − 1 ) + s u m ( a − 1 , c − 1 ) sum(b,d)-sum(a-1,d)-sum(b,c-1)+sum(a-1,c-1) sum(b,d)sum(a1,d)sum(b,c1)+sum(a1,c1)
每个 s u m sum sum 都可以用与 BZOJ - 1101 相同的思路进行求解。

3. HDOJ - 1695

3.1 题面

给定 b , d , k b, d, k b,d,k i ∈ [ 1 , b ] , j ∈ [ 1 , d ] i \in [1,b], j \in [1,d] i[1,b],j[1,d] 范围内满足 gcd ( i , j ) = k \text{gcd}(i,j)=k gcd(i,j)=k ( i , j ) (i,j) (i,j) 对数。

规定 ( i , j ) (i,j) (i,j) ( j , i ) (j,i) (j,i) 算相同的一对。

共有 T ( 1 ≤ T ≤ 3000 ) T(1 \le T \le 3000) T(1T3000) 组数据。

数据范围: 1 ≤ c , d ≤ 1 0 5 1 \le c,d \le 10^5 1c,d105

3.2 解题过程

s u m ( a , b ) = ∑ i = 1 a ∑ j = 1 b [ gcd ( i , j ) = k ] sum(a,b)=\sum_{i=1}^{a} \sum_{j=1}^{b} [\text{gcd}(i,j)=k] sum(a,b)=i=1aj=1b[gcd(i,j)=k] ,可以发现重复的数对一定出现在 [ 1 , min ⁡ ( b , d ) ] [1,\min(b,d)] [1,min(b,d)] 的范围内,则答案
s u m ( b , d ) − s u m ( min ⁡ ( b , d ) ) 2 sum(b,d)-\frac{sum(\min(b,d))}{2} sum(b,d)2sum(min(b,d))

4. Luogu - P2303

4.1 题面

给定 n n n,求 ∑ i = 1 n gcd ( i , n ) \sum_{i=1}^n{\text{gcd}\left( i,n \right)} i=1ngcd(i,n) 的值。

数据范围: 0 &lt; n ≤ 2 32 0 &lt; n \le 2^{32} 0<n232

4.2 解题过程

∑ i = 1 n gcd ( i , n ) = ∑ k ∣ n ∑ i = 1 n [ gcd ( i , n ) = k ] ⋅ k , ( k ∣ gcd ( i , n ) ) = ∑ k ∣ n k ∑ i = 1 n k [ gcd ( i , n ) = 1 ] = ∑ k ∣ n k ⋅ φ ( n k ) \begin{aligned} &amp;\sum_{i=1}^n{\text{gcd}\left( i,n \right)} \\ =&amp;\sum_{k|n}{\sum_{i=1}^n{\left[ \text{gcd}\left( i,n \right) =k \right] \cdot k}},\left( k|\text{gcd}\left( i,n \right) \right) \\ =&amp;\sum_{k|n}{k\sum_{i=1}^{\frac{n}{k}}{\left[ \text{gcd}\left( i,n \right) =1 \right]}} \\ =&amp;\sum_{k|n}{k\cdot \varphi \left( \frac{n}{k} \right)} \end{aligned} ===i=1ngcd(i,n)kni=1n[gcd(i,n)=k]k,(kgcd(i,n))knki=1kn[gcd(i,n)=1]knkφ(kn)

我们可以枚举 n n n因子,将每个因子的贡献加到答案中。

时间复杂度: O ( n n = n 3 4 ) O(\sqrt{n\sqrt n}=n^{\frac{3}{4}}) O(nn =n43)

4.3 代码

ll getphi(ll n)
{
    ll res = n;
    for(ll i = 2; i * i <= n; i++)
    {
        if(n % i == 0)
        {
            res = res - res / i;
            while(n % i == 0)
                n /= i;
        }
    }
    if(n > 1)
        res = res - res / n;
    return res;
}

int main()
{
    ll n;
    scanf("%lld", &n);

    ll answer = 0;
    for(ll i = 1; i * i <= n; i++)
    {
        if(n % i)   continue;
        answer += i * getphi(n / i);
        if(n / i != i)  answer += n / i * getphi(i);
    } 
    printf("%lld\n", answer);
    return 0;
}

5. BZOJ - 2154

5.1 题面

∑ i = 1 n ∑ j = 1 m lcm ( i , j ) \sum_{i=1}^n{\sum_{j=1}^m{\text{lcm}\left( i,j \right)}} i=1nj=1mlcm(i,j) 的值,答案对 20101009 20101009 20101009 取模。

数据范围: 1 ≤ n , m ≤ 1 0 7 1 \le n,m \le 10^7 1n,m107

5.2 解题过程

∑ i = 1 n ∑ j = 1 m lcm ( i , j ) = ∑ k = 1 min ⁡ ( n , m ) ∑ i = 1 n ∑ j = 1 m i ⋅ j k [ gcd ( i , j ) = k ] = ∑ k = 1 min ⁡ ( n , m ) ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ m k ⌋ i j k [ gcd ( i , j ) = 1 ] , ( i ← k ⋅ i , j ← k ⋅ j ) = ∑ k = 1 min ⁡ ( n , m ) k ∑ d = 1 min ⁡ ( ⌊ n k ⌋ , ⌊ m k ⌋ ) μ ( d ) ( ∑ i = 1 ⌊ n k ⌋ [ d ∣ i ] ⋅ i ) ( ∑ j = 1 ⌊ m k ⌋ [ d ∣ j ] ⋅ j ) = ∑ k = 1 min ⁡ ( n , m ) k ∑ d = 1 min ⁡ ( ⌊ n k ⌋ , ⌊ m k ⌋ ) μ ( d ) ( ∑ p = 1 ⌊ n k d ⌋ d p ) ( ∑ q = 1 ⌊ m k d ⌋ d q ) , ( i ← d p , j ← d q ) = ∑ k = 1 min ⁡ ( n , m ) k ∑ d = 1 min ⁡ ( ⌊ n k ⌋ , ⌊ m k ⌋ ) d 2 ⋅ μ ( d ) ( ∑ p = 1 ⌊ n k d ⌋ p ) ( ∑ q = 1 ⌊ m k d ⌋ q ) = ∑ k = 1 min ⁡ ( n , m ) k ∑ d = 1 min ⁡ ( ⌊ n k ⌋ , ⌊ m k ⌋ ) d 2 ⋅ μ ( d ) ( ( 1 + ⌊ n k d ⌋ ) ⋅ ⌊ n k d ⌋ 2 ) ( ( 1 + ⌊ m k d ⌋ ) ⋅ ⌊ m k d ⌋ 2 ) = ∑ l = 1 min ⁡ ( n , m ) ( ( 1 + ⌊ n l ⌋ ) ⋅ ⌊ n l ⌋ 2 ) ( ( 1 + ⌊ m l ⌋ ) ⋅ ⌊ m l ⌋ 2 ) ∑ d ∣ l μ ( d ) ⋅ l d \begin{aligned} &amp;\sum_{i=1}^n{\sum_{j=1}^m{\text{lcm}\left( i,j \right)}} \\ &amp;=\sum_{k=1}^{\min \left( n,m \right)}{\sum_{i=1}^n{\begin{array}{c} \sum_{j=1}^m{\frac{i\cdot j}{k}\left[ \text{gcd}\left( i,j \right) =k \right]}\\ \end{array}}} \\ &amp;=\sum_{k=1}^{\min \left( n,m \right)}{\sum_{i=1}^{\lfloor \frac{n}{k} \rfloor}{\sum_{j=1}^{\lfloor \frac{m}{k} \rfloor}{ijk\left[ \text{gcd}\left( i,j \right) =1 \right]}}},\left( i\gets k\cdot i,j\gets k\cdot j \right) \\ &amp;=\sum_{k=1}^{\min \left( n,m \right)}{k\sum_{d=1}^{\min \left( \lfloor \frac{n}{k} \rfloor ,\lfloor \frac{m}{k} \rfloor \right)}{\mu \left( d \right)}}\left( \sum_{i=1}^{\lfloor \frac{n}{k} \rfloor}{\left[ d|i \right] \cdot i} \right) \left( \sum_{j=1}^{\lfloor \frac{m}{k} \rfloor}{\left[ d|j \right] \cdot j} \right) \\ &amp;=\sum_{k=1}^{\min \left( n,m \right)}{k\sum_{d=1}^{\min \left( \lfloor \frac{n}{k} \rfloor ,\lfloor \frac{m}{k} \rfloor \right)}{\mu \left( d \right)}}\left( \sum_{p=1}^{\lfloor \frac{n}{kd} \rfloor}{dp} \right) \left( \sum_{q=1}^{\lfloor \frac{m}{kd} \rfloor}{dq} \right) ,\left( i\gets dp,j\gets dq \right) \\ &amp;=\sum_{k=1}^{\min \left( n,m \right)}{k\sum_{d=1}^{\min \left( \lfloor \frac{n}{k} \rfloor ,\lfloor \frac{m}{k} \rfloor \right)}{d^2\cdot \mu \left( d \right)}}\left( \sum_{p=1}^{\lfloor \frac{n}{kd} \rfloor}{p} \right) \left( \sum_{q=1}^{\lfloor \frac{m}{kd} \rfloor}{q} \right) \\ &amp;=\sum_{k=1}^{\min \left( n,m \right)}{k\sum_{d=1}^{\min \left( \lfloor \frac{n}{k} \rfloor ,\lfloor \frac{m}{k} \rfloor \right)}{d^2\cdot \mu \left( d \right)}}\left( \frac{\left( 1+\lfloor \frac{n}{kd} \rfloor \right) \cdot \lfloor \frac{n}{kd} \rfloor}{2} \right) \left( \frac{\left( 1+\lfloor \frac{m}{kd} \rfloor \right) \cdot \lfloor \frac{m}{kd} \rfloor}{2} \right) \\ &amp;=\sum_{l=1}^{\min \left( n,m \right)}{\left( \frac{\left( 1+\lfloor \frac{n}{l} \rfloor \right) \cdot \lfloor \frac{n}{l} \rfloor}{2} \right) \left( \frac{\left( 1+\lfloor \frac{m}{l} \rfloor \right) \cdot \lfloor \frac{m}{l} \rfloor}{2} \right) \sum_{d|l}{\mu \left( d \right) \cdot ld}} \end{aligned} i=1nj=1mlcm(i,j)=k=1min(n,m)i=1nj=1mkij[gcd(i,j)=k]=k=1min(n,m)i=1knj=1kmijk[gcd(i,j)=1],(iki,jkj)=k=1min(n,m)kd=1min(kn,km)μ(d)i=1kn[di]ij=1km[dj]j=k=1min(n,m)kd=1min(kn,km)μ(d)p=1kdndpq=1kdmdq,(idp,jdq)=k=1min(n,m)kd=1min(kn,km)d2μ(d)p=1kdnpq=1kdmq=k=1min(n,m)kd=1min(kn,km)d2μ(d)(2(1+kdn)kdn)(2(1+kdm)kdm)=l=1min(n,m)(2(1+ln)ln)(2(1+lm)lm)dlμ(d)ld

5.3 优化技巧

在推导的过程中,我们得到了一个积性函数,因此优化的方法是 O ( n ) O(n) O(n) 地通过线性筛预处理出积性函数的所有值

这样,我们便可在 O ( 1 ) O(1) O(1) 的时间内查询到函数的值。

6. BZOJ - 2693

6.1 题面

∑ i = 1 n ∑ j = 1 m lcm ( i , j ) \sum_{i=1}^n{\sum_{j=1}^m{\text{lcm}\left( i,j \right)}} i=1nj=1mlcm(i,j) 的值,共有 T T T 组询问,答案对 1 0 8 + 9 10^8+9 108+9 取模。

数据范围: 1 ≤ n , m ≤ 1 0 7 1 \le n,m \le 10^7 1n,m107 1 ≤ T ≤ 1 0 4 1 \le T \le 10^4 1T104

6.2 解题过程

分块完成 5.2 5.2 5.2 节的计算即可,注意取模

时间复杂度 O ( min ⁡ { n , m } ) ​ O(\sqrt {\min\left\{n,m\right\}})​ O(min{n,m} )

7. CCPC-Wannafly Winter Camp Day-3 Div.2 F 小清新数论

7.1 题面

∑ i = 1 n ∑ j = 1 n μ ( gcd ( i , j ) ) ​ \sum_{i=1}^n{\sum_{j=1}^n{\mu \left( \text{gcd}\left( i,j \right) \right)}}​ i=1nj=1nμ(gcd(i,j)) 的值。

数据范围: 1 ≤ n ≤ 1 0 7 1 \le n \le 10^7 1n107

7.2 解题过程

∑ i = 1 n ∑ j = 1 n μ ( gcd ( i , j ) ) = ∑ k = 1 n ∑ i = 1 n ∑ j = 1 n μ ( k ) [ gcd ( i , j ) = k ] = ∑ k = 1 n ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ n k ⌋ μ ( k ) [ gcd ( i , j ) = 1 ] = ∑ k = 1 n μ ( k ) ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ n k ⌋ ∑ d ∣ gcd ( i , j ) μ ( d ) = ∑ k = 1 n μ ( k ) ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ n k ⌋ ∑ d = 1 ⌊ n k ⌋ [ d ∣ i ] [ d ∣ j ] μ ( d ) = ∑ k = 1 n μ ( k ) ∑ d = 1 ⌊ n k ⌋ μ ( d ) ( ∑ i = 1 ⌊ n k ⌋ [ d ∣ i ] ) ( ∑ j = 1 ⌊ n k ⌋ [ d ∣ j ] ) = ∑ k = 1 n μ ( k ) ∑ d = 1 ⌊ n k ⌋ μ ( d ) ⌊ n k d ⌋ 2 = ∑ l = 1 n ⌊ n l ⌋ 2 ∑ k ∣ l μ ( k ) μ ( l k ) , l = k d \begin{aligned} &amp;\sum_{i=1}^n{\sum_{j=1}^n{\mu \left( \text{gcd}\left( i,j \right) \right)}} \\ &amp;=\sum_{k=1}^n{\sum_{i=1}^n{\sum_{j=1}^n{\mu \left( k \right) \left[ \text{gcd}\left( i,j \right) =k \right]}}} \\ &amp;=\sum_{k=1}^n{\sum_{i=1}^{\lfloor \frac{n}{k} \rfloor}{\sum_{j=1}^{\lfloor \frac{n}{k} \rfloor}{\mu \left( k \right) \left[ \text{gcd}\left( i,j \right) =1 \right]}}} \\ &amp;=\sum_{k=1}^n{\mu \left( k \right) \sum_{i=1}^{\lfloor \frac{n}{k} \rfloor}{\sum_{j=1}^{\lfloor \frac{n}{k} \rfloor}{\sum_{d|\text{gcd}\left( i,j \right)}{\mu \left( d \right)}}}} \\ &amp;=\sum_{k=1}^n{\mu \left( k \right) \sum_{i=1}^{\lfloor \frac{n}{k} \rfloor}{\sum_{j=1}^{\lfloor \frac{n}{k} \rfloor}{\sum_{d=1}^{\lfloor \frac{n}{k} \rfloor}{\left[ d|i \right] \left[ d|j \right] \mu \left( d \right)}}}} \\ &amp;=\sum_{k=1}^n{\mu \left( k \right) \sum_{d=1}^{\lfloor \frac{n}{k} \rfloor}{\mu \left( d \right)}}\left( \sum_{i=1}^{\lfloor \frac{n}{k} \rfloor}{\left[ d|i \right]} \right) \left( \sum_{j=1}^{\lfloor \frac{n}{k} \rfloor}{\left[ d|j \right]} \right) \\ &amp;=\sum_{k=1}^n{\mu \left( k \right) \sum_{d=1}^{\lfloor \frac{n}{k} \rfloor}{\mu \left( d \right)}\lfloor \frac{n}{kd} \rfloor ^2} \\ &amp;=\sum_{l=1}^n{\lfloor \frac{n}{l} \rfloor ^2\sum_{k|l}{\mu \left( k \right) \mu \left( \frac{l}{k} \right)}},l=kd \\ \end{aligned} i=1nj=1nμ(gcd(i,j))=k=1ni=1nj=1nμ(k)[gcd(i,j)=k]=k=1ni=1knj=1knμ(k)[gcd(i,j)=1]=k=1nμ(k)i=1knj=1kndgcd(i,j)μ(d)=k=1nμ(k)i=1knj=1knd=1kn[di][dj]μ(d)=k=1nμ(k)d=1knμ(d)i=1kn[di]j=1kn[dj]=k=1nμ(k)d=1knμ(d)kdn2=l=1nln2klμ(k)μ(kl),l=kd

我们设
f ( l ) = ∑ k ∣ l μ ( k ) μ ( l k ) f\left( l \right) =\sum_{k|l}{\mu \left( k \right) \mu \left( \frac{l}{k} \right)} f(l)=klμ(k)μ(kl)
则很显然, f ( l ) f(l) f(l)狄利克雷卷积的形式,又因为 μ ( x ) \mu(x) μ(x)积性函数,因此 f ( l ) f(l) f(l) 也为积性函数

因此,我们可以通过 O ( n ) O(n) O(n)线性筛求出 f ( l ) f(l) f(l) 的前 n n n 项。

f ( l ) f(l) f(l) 的定义,我们知道,

f ( 1 ) = 1 , f ( p ) = − 2 , f ( p k ) = 0 , k ≥ 2 , p f(1) = 1, f(p)=-2, f(p^k)=0, k \ge 2, p f(1)=1,f(p)=2,f(pk)=0,k2,p素数

因此 f ( l ) f(l) f(l)求解代码如下:

bool isnotprime[maxn];
ll prime[maxn];
int func[maxn];
int cnt = 0;
void functionsieve(ll range)
{
    func[1] = 1;
    for(ll i = 2; i <= range; i++)
    {
        if(!isnotprime[i])
        {
            prime[++cnt] = i;
            func[i] = -2;
        }
        for(int j = 1; j <= cnt; j++)
        {
            if(i * prime[j] > range)    break;
            isnotprime[i * prime[j]] = true;
            if(i % prime[j] == 0)
            {
                if((i / prime[j]) % prime[j] == 0)  func[i * prime[j]] = 0;
                else                                func[i * prime[j]] = func[i / prime[j]];
                break;
            }
            else func[i * prime[j]] = -2 * func[i];
        }
    }
}

7.3 优化技巧

在推导的过程中,我们得到了一个积性函数,因此优化的方法是 O ( n ) O(n) O(n) 地通过线性筛预处理出积性函数的所有值

这样,我们便可在 O ( 1 ) O(1) O(1) 的时间内查询到函数的值。

总的时间复杂度为: O ( n ) O(n) O(n)

8. BZOJ - 2818

8.1 题面

∑ i = 1 n ∑ j = 1 n [ gcd ( i , j ) &ThinSpace;&ThinSpace; is a prime ] \sum_{i=1}^n{\sum_{j=1}^n{\left[ \text{gcd}\left( i,j \right) \,\,\text{is a prime} \right]}} i=1nj=1n[gcd(i,j)is a prime] 的值。

数据范围: 1 ≤ n ≤ 1 0 7 1 \le n \le 10^7 1n107

8.2 解题过程

∑ i = 1 n ∑ j = 1 n [ gcd ( i , j ) &ThinSpace;&ThinSpace; is a prime ] = ∑ p = 2 m a x p r i m e ∑ i = 1 n ∑ j = 1 n [ gcd ( i , j ) = p ] = ∑ p = 2 m a x p r i m e ∑ i = 1 ⌊ n p ⌋ ∑ j = 1 ⌊ n p ⌋ [ gcd ( i , j ) = 1 ] = ∑ p = 2 m a x p r i m e ∑ i = 1 ⌊ n p ⌋ ∑ j = 1 ⌊ n p ⌋ ∑ k = 1 ⌊ n p ⌋ [ k ∣ i ] [ k ∣ j ] ⋅ μ ( k ) = ∑ p = 2 m a x p r i m e ∑ k = 1 ⌊ n p ⌋ μ ( k ) ⋅ ⌊ n p k ⌋ 2 \begin{aligned} &amp;\sum_{i=1}^n{\sum_{j=1}^n{\left[ \text{gcd}\left( i,j \right) \,\,\text{is a prime} \right]}} \\ &amp;=\sum_{p=2}^{maxprime}{\sum_{i=1}^n{\sum_{j=1}^n{\left[ \text{gcd}\left( i,j \right) =p \right]}}} \\ &amp;=\sum_{p=2}^{maxprime}{\sum_{i=1}^{\lfloor \frac{n}{p} \rfloor}{\sum_{j=1}^{\lfloor \frac{n}{p} \rfloor}{\left[ \text{gcd}\left( i,j \right) =1 \right]}}} \\ &amp;=\sum_{p=2}^{maxprime}{\sum_{i=1}^{\lfloor \frac{n}{p} \rfloor}{\sum_{j=1}^{\lfloor \frac{n}{p} \rfloor}{\sum_{k=1}^{\lfloor \frac{n}{p} \rfloor}{\left[ k|i \right] \left[ k|j \right] \cdot \mu \left( k \right)}}}} \\ &amp;=\sum_{p=2}^{maxprime}{\sum_{k=1}^{\lfloor \frac{n}{p} \rfloor}{\mu \left( k \right) \cdot \lfloor \frac{n}{pk} \rfloor ^2}} \end{aligned} i=1nj=1n[gcd(i,j)is a prime]=p=2maxprimei=1nj=1n[gcd(i,j)=p]=p=2maxprimei=1pnj=1pn[gcd(i,j)=1]=p=2maxprimei=1pnj=1pnk=1pn[ki][kj]μ(k)=p=2maxprimek=1pnμ(k)pkn2

注意到, 1 0 7 10^{7} 107 以内的素数只有 664579 664579 664579,而
lim ⁡ n → ∞ ∑ i = 1 n n i = log ⁡ n \lim_{n\rightarrow \infty} \sum_{i=1}^n{\frac{n}{i}}=\log n nlimi=1nin=logn
因此,总的时间复杂度 O ( 664579 ⋅ log ⁡ n ) O(664579 \cdot \log n) O(664579logn)

9. BZOJ - 4407

9.1 题面

给定 n , m , k n,m,k n,m,k,求 ∑ i = 1 n ∑ j = 1 m gcd ( i , j ) k \sum_{i=1}^n{\sum_{j=1}^m{\text{gcd}\left( i,j \right) ^k}} i=1nj=1mgcd(i,j)k 1 0 9 + 7 10^9+7 109+7 取模之后的值。

共有 T ( 1 ≤ T ≤ 2000 ) T(1\le T \le 2000) T(1T2000) 组数据。

数据范围: 1 ≤ n , m , k ≤ 5 ⋅ 1 0 6 1 \le n,m,k \le 5 \cdot 10^6 1n,m,k5106

9.2 解题过程

∑ i = 1 n ∑ j = 1 m gcd ( i , j ) k = ∑ q = 1 min ⁡ ( n , m ) ∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) = q ] ⋅ q k = ∑ q = 1 min ⁡ ( n , m ) q k ∑ i = 1 ⌊ n q ⌋ ∑ j = 1 ⌊ m q ⌋ [ gcd ( i , j ) = 1 ] = ∑ q = 1 min ⁡ ( n , m ) q k ∑ d = 1 min ⁡ ( ⌊ n q ⌋ , ⌊ m q ⌋ ) μ ( d ) ⌊ n q d ⌋ ⌊ m q d ⌋ = ∑ l = 1 min ⁡ ( n , m ) ⌊ n l ⌋ ⌊ m l ⌋ ∑ q ∣ l q k μ ( l q ) , l = q d \begin{aligned} &amp;\sum_{i=1}^n{\sum_{j=1}^m{\text{gcd}\left( i,j \right) ^k}} \\ =&amp;\sum_{q=1}^{\min \left( n,m \right)}{\sum_{i=1}^n{\sum_{j=1}^m{\left[ \text{gcd}\left( i,j \right) =q \right] \cdot q^k}}} \\ =&amp;\sum_{q=1}^{\min \left( n,m \right)}{q^k\sum_{i=1}^{\lfloor \frac{n}{q} \rfloor}{\sum_{j=1}^{\lfloor \frac{m}{q} \rfloor}{\left[ \text{gcd}\left( i,j \right) =1 \right]}}} \\ =&amp;\sum_{q=1}^{\min \left( n,m \right)}{q^k\sum_{d=1}^{\min \left( \lfloor \frac{n}{q} \rfloor ,\lfloor \frac{m}{q} \rfloor \right)}{\mu \left( d \right) \lfloor \frac{n}{qd} \rfloor \lfloor \frac{m}{qd} \rfloor}} \\ =&amp;\sum_{l=1}^{\min \left( n,m \right)}{\lfloor \frac{n}{l} \rfloor \lfloor \frac{m}{l} \rfloor \sum_{q|l}{q^k\mu \left( \frac{l}{q} \right)}},l=qd \end{aligned} ====i=1nj=1mgcd(i,j)kq=1min(n,m)i=1nj=1m[gcd(i,j)=q]qkq=1min(n,m)qki=1qnj=1qm[gcd(i,j)=1]q=1min(n,m)qkd=1min(qn,qm)μ(d)qdnqdml=1min(n,m)lnlmqlqkμ(ql),l=qd

f ( l ) = ∑ q ∣ l q k μ ( l q ) f\left( l \right) =\sum_{q|l}{q^k\mu \left( \frac{l}{q} \right)} f(l)=qlqkμ(ql),显然 f ( l ) f(l) f(l)积性函数

可以发现, f ( 1 ) = 1 f(1)=1 f(1)=1 f ( p ) = p k − 1 f(p)=p^k-1 f(p)=pk1 f ( p l ) = p k l − p k ( l − 1 ) = p k ( l − 1 ) ( p k − 1 ) f(p^l)=p^{kl}-p^{k(l-1)}=p^{k(l-1)}(p^k-1) f(pl)=pklpk(l1)=pk(l1)(pk1)

因此我们可以利用线性筛求出 f ( l ) f(l) f(l) 的前缀和。

之后通过根号分块求解最终答案。

9.3 代码

bool isnotprime[maxn];
int prime[maxn];
ll po[maxn], f[maxn], prefix[maxn];
int cnt = 0;

ll pow_mod(ll a, ll b)
{
    ll res = 1;
    a = a % Mod;
    while(b > 0)
    {
        if(b % 2 == 1)  res = (res * a) % Mod;
        b = b / 2;
        a = (a * a) % Mod;
    }
    return res;
}

void linearsieve(int range)
{
    f[1] = 1;
    prefix[1] = 1;
    for(int i = 2; i <= range; i++)
    {
        if(!isnotprime[i])
        {
            prime[++cnt] = i;
            f[i] = (po[i] - 1 + Mod) % Mod;
        }
        for(int j = 1; j <= cnt; j++)
        {
            if(i * prime[j] > range)    break;
            isnotprime[i * prime[j]] = true;
            if(i % prime[j] == 0)
            {
                f[i * prime[j]] = f[i] * po[prime[j]] % Mod;
                break;
            }
            else f[i * prime[j]] = f[i] * f[prime[j]] % Mod;
        }
        prefix[i] = (prefix[i - 1] + f[i]) % Mod;
    }
}

int main()
{
    int t, k, n, m;
    scanf("%d%d", &t, &k);

    for(int i = 1; i <= 5000000; i++)   po[i] = pow_mod(1LL * i, k);
    linearsieve(5000000);

    while(t--)
    {
        scanf("%d%d", &n, &m);
        ll answer = 0;
        int pos = 0, last = 0;
        int minvalue = min(m, n);
        while(pos + 1 <= minvalue)
        {
            pos = min(m / (m / (pos + 1)), n / (n / (pos + 1)));
            answer = (answer + (prefix[pos] - prefix[last] + Mod) % Mod * (m / pos) % Mod * (n / pos) % Mod) % Mod;
            last = pos;
        }
        printf("%lld\n", answer);
    }
    return 0;
}

10. BZOJ - 2820

10.1 题面

∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) &ThinSpace;&ThinSpace; is a prime ] \sum_{i=1}^n{\sum_{j=1}^m{\left[ \text{gcd}\left( i,j \right) \,\,\text{is a prime} \right]}} i=1nj=1m[gcd(i,j)is a prime] 的值,有 T T T 组询问。

数据范围: 1 ≤ n , m ≤ 1 0 7 1 \le n,m \le 10^7 1n,m107 1 ≤ T ≤ 1 0 4 1 \le T \le 10^4 1T104

10.2 解题过程

本题为 BZOJ - 2818多组询问版本
∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) &ThinSpace;&ThinSpace; is a prime ] = ∑ p = 2 m a x p r i m e ∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) = p ] = ∑ p = 2 m a x p r i m e ∑ i = 1 ⌊ n p ⌋ ∑ j = 1 ⌊ m p ⌋ [ gcd ( i , j ) = 1 ] = ∑ p = 2 m a x p r i m e ∑ i = 1 ⌊ n p ⌋ ∑ j = 1 ⌊ m p ⌋ ∑ k = 1 min ⁡ { ⌊ n p ⌋ , ⌊ m p ⌋ } [ k ∣ i ] [ k ∣ j ] ⋅ μ ( k ) = ∑ p = 2 m a x p r i m e ∑ k = 1 min ⁡ { ⌊ n p ⌋ , ⌊ m p ⌋ } μ ( k ) ⋅ ⌊ n p k ⌋ ⌊ m p k ⌋ = ∑ l = 1 min ⁡ { n , m } ⌊ n l ⌋ ⌊ m l ⌋ ∑ p ∣ l μ ( l p ) , p &ThinSpace;&ThinSpace; is prime \begin{aligned} &amp;\sum_{i=1}^n{\sum_{j=1}^m{\left[ \text{gcd}\left( i,j \right) \,\,\text{is a prime} \right]}} \\ &amp;=\sum_{p=2}^{maxprime}{\sum_{i=1}^n{\sum_{j=1}^m{\left[ \text{gcd}\left( i,j \right) =p \right]}}} \\ &amp;=\sum_{p=2}^{maxprime}{\sum_{i=1}^{\lfloor \frac{n}{p} \rfloor}{\sum_{j=1}^{\lfloor \frac{m}{p} \rfloor}{\left[ \text{gcd}\left( i,j \right) =1 \right]}}} \\ &amp;=\sum_{p=2}^{maxprime}{\sum_{i=1}^{\lfloor \frac{n}{p} \rfloor}{\sum_{j=1}^{\lfloor \frac{m}{p} \rfloor}{\sum_{k=1}^{{\min\left\{\lfloor \frac{n}{p}\rfloor, \lfloor \frac{m}{p}\rfloor\right\}} }{\left[ k|i \right] \left[ k|j \right] \cdot \mu \left( k \right)}}}} \\ &amp;=\sum_{p=2}^{maxprime}{\sum_{k=1}^{\min \left\{ \lfloor \frac{n}{p} \rfloor ,\lfloor \frac{m}{p} \rfloor \right\}}{\mu \left( k \right) \cdot \lfloor \frac{n}{pk} \rfloor \lfloor \frac{m}{pk} \rfloor}} \\ &amp;=\sum_{l=1}^{\min \left\{ n,m \right\}}{\lfloor \frac{n}{l} \rfloor \lfloor \frac{m}{l} \rfloor \sum_{p|l}{\mu \left( \frac{l}{p} \right) ,p\,\,\text{is prime}}} \\ \end{aligned} i=1nj=1m[gcd(i,j)is a prime]=p=2maxprimei=1nj=1m[gcd(i,j)=p]=p=2maxprimei=1pnj=1pm[gcd(i,j)=1]=p=2maxprimei=1pnj=1pmk=1min{pn,pm}[ki][kj]μ(k)=p=2maxprimek=1min{pn,pm}μ(k)pknpkm=l=1min{n,m}lnlmplμ(pl),pis prime
f ( l ) = ∑ p ∣ l μ ( l p ) f\left( l \right) =\sum_{p|l}{\mu \left( \frac{l}{p} \right)} f(l)=plμ(pl),其中 p p p素数

尽管 f ( l ) f(l) f(l) 不是积性函数,我们仍然可以通过线性筛将其前缀和预处理出来。

注意到, f ( 1 ) = 0 f(1)=0 f(1)=0 f ( p ) = 1 f(p)=1 f(p)=1 f ( p 1 p 2 . . . p n − 1 p n 2 ) = μ ( p 1 p 2 . . . p n − 1 p n ) f(p_1p_2...p_{n-1}p_n^2)=\mu(p_1p_2...p_{n-1}p_n) f(p1p2...pn1pn2)=μ(p1p2...pn1pn)

l = p 1 k 1 p 2 k 2 p 3 k 3 . . . p n k n l=p_1^{k_1}p_2^{k_2}p_3^{k_3}...p_n^{k_n} l=p1k1p2k2p3k3...pnkn max ⁡ { k 1 , k 2 , k 3 , . . . , k n } ≥ 3 \max\left\{k_1,k_2,k_3,...,k_n\right\} \ge 3 max{k1,k2,k3,...,kn}3 或者 { k 1 , k 2 , k 3 , . . . , k n } \left\{k_1,k_2,k_3,...,k_n\right\} {k1,k2,k3,...,kn} 中出现了大于等于 2 2 2 个的 2 2 2,则 f ( l ) = 0 f(l)=0 f(l)=0

除此之外,若 a a a b b b 互质,且 b b b质数,则对于 l = a b l=ab l=ab 来说,

( 1 ) (1) (1) b b b 的引入会使 f ( a ) f(a) f(a) 在原基础上全部取负值(因为自变量乘上一个原来未出现过质因子 μ ( x ) \mu(x) μ(x) 会变为原来的相反数);

( 2 ) (2) (2) b b b 这一因子本身 f ( l ) f(l) f(l) 的贡献为 μ ( a ) \mu(a) μ(a),因为 l b = a \frac{l}{b}=a bl=a

因此,在此情况下 f ( l ) = − f ( a ) + μ ( a ) f(l)=-f(a)+\mu(a) f(l)=f(a)+μ(a)

所以,我们便可利用线性筛,在 O ( n ) O(n) O(n) 的时间复杂度内,求出 f ( l ) f(l) f(l)前缀和

之后,我们便可 O ( min ⁡ { n , m } ) O(\sqrt {\min\left\{n,m\right\}}) O(min{n,m} ) 地求出每一次询问的答案。

总的时间复杂度 O ( T ⋅ min ⁡ { n , m } ) O(T \cdot \sqrt {\min\left\{n,m\right\}}) O(Tmin{n,m} )

10.3 线性筛求 f ( l ) f(l) f(l) 的前缀和

bool isnotprime[maxn];
ll prime[maxn];
ll f[maxn], prefix[maxn], mu[maxn];
int cnt = 0;
void mobiussieve(ll range)
{
    f[1] = 0;
    mu[1] = 1;
    prefix[1] = 0;
    for(ll i = 2; i <= range; i++)
    {
        if(!isnotprime[i])
        {
            prime[++cnt] = i;
            f[i] = 1;
            mu[i] = -1;
        }
        for(int j = 1; j <= cnt; j++)
        {
            if(i * prime[j] > range)    break;
            isnotprime[i * prime[j]] = true;
            if(i % prime[j] == 0)
            {
                if(i / prime[j] % prime[j] != 0)    f[i * prime[j]] = mu[i];
                else f[i * prime[j]] = 0;
                mu[i * prime[j]] = 0;
                break;
            }
            else
            {
                f[i * prime[j]] = -f[i] + mu[i];
                mu[i * prime[j]] = -mu[i];
            }
        }
        prefix[i] = prefix[i - 1] + f[i];
    }
}

11. Luogu - P3935

11.1 题面

∑ i = l r d ( i ) \sum_{i=l}^r{d\left( i \right)} i=lrd(i) 998244353 998244353 998244353 取模之后的值。

数据范围: 1 ≤ l ≤ 1 0 14 1 \le l \le 10^{14} 1l1014 1 ≤ r ≤ 1.6 ⋅ 1 0 14 1 \le r \le 1.6 \cdot 10^{14} 1r1.61014

11.2 解题过程

∑ i = 1 n d ( i ) = ∑ i = 1 n ∑ d ∣ i 1 = ∑ k = 1 n ∑ d = 1 ⌊ n k ⌋ 1 , i = k d = ∑ k = 1 n ⌊ n k ⌋ \begin{aligned} &amp;\sum_{i=1}^n{d\left( i \right)} \\ =&amp;\sum_{i=1}^n{\sum_{d|i}{1}} \\ =&amp;\sum_{k=1}^n{\sum_{d=1}^{\lfloor \frac{n}{k} \rfloor}{1}},i=kd \\ =&amp;\sum_{k=1}^n{\lfloor \frac{n}{k} \rfloor} \end{aligned} ===i=1nd(i)i=1ndi1k=1nd=1kn1,i=kdk=1nkn

可以通过根号分块得到答案。

12. BZOJ - 3309

12.1 题面

∑ i = 1 a ∑ j = 1 b f ( gcd ( i , j ) ) \sum_{i=1}^{a} \sum_{j=1}^{b} f(\text{gcd}(i,j)) i=1aj=1bf(gcd(i,j)) 的值。

其中 f ( n ) f(n) f(n) 表示 n n n 所含质因子的最大幂指数。

T T T 组输入,满足 T ≤ 1 0 4 T \le 10^4 T104

数据范围: 1 ≤ a , b ≤ 1 0 7 1 \le a,b \le 10^7 1a,b107

12.2 解题过程

∑ i = 1 a ∑ j = 1 b f [ gcd ( i , j ) ] = ∑ k = 1 min ⁡ ( a , b ) ∑ i = 1 a ∑ j = 1 b f ( k ) ⋅ [ gcd ( i , j ) = k ] = ∑ k = 1 min ⁡ ( a , b ) f ( k ) ∑ i = 1 ⌊ a k ⌋ ∑ j = 1 ⌊ b k ⌋ [ gcd ( i , j ) = 1 ] = ∑ k = 1 min ⁡ ( a , b ) f ( k ) ∑ i = 1 ⌊ a k ⌋ ∑ j = 1 ⌊ b k ⌋ ∑ d ∣ gcd ( i , j ) μ ( d ) = ∑ k = 1 min ⁡ ( a , b ) f ( k ) ∑ i = 1 ⌊ a k ⌋ ∑ j = 1 ⌊ b k ⌋ ∑ d = 1 min ⁡ ( ⌊ a k ⌋ , ⌊ b k ⌋ ) μ ( d ) [ d ∣ i ] [ d ∣ j ] = ∑ k = 1 min ⁡ ( a , b ) f ( k ) ∑ d = 1 min ⁡ ( ⌊ a k ⌋ , ⌊ b k ⌋ ) μ ( d ) ⌊ a k d ⌋ ⌊ b k d ⌋ = ∑ l = 1 min ⁡ ( a , b ) ⌊ a l ⌋ ⌊ b l ⌋ ∑ k ∣ l f ( k ) μ ( l k ) \begin{aligned} &amp;\sum_{i=1}^a{\sum_{j=1}^b{f\left[ \text{gcd}\left( i,j \right) \right]}} \\ =&amp;\sum_{k=1}^{\min \left( a,b \right)}{\sum_{i=1}^a{\sum_{j=1}^b{f\left( k \right) \cdot \left[ \text{gcd}\left( i,j \right) =k \right]}}} \\ =&amp;\sum_{k=1}^{\min \left( a,b \right)}{f\left( k \right) \sum_{i=1}^{\lfloor \frac{a}{k} \rfloor}{\sum_{j=1}^{\lfloor \frac{b}{k} \rfloor}{\left[ \text{gcd}\left( i,j \right) =1 \right]}}} \\ =&amp;\sum_{k=1}^{\min \left( a,b \right)}{f\left( k \right) \sum_{i=1}^{\lfloor \frac{a}{k} \rfloor}{\sum_{j=1}^{\lfloor \frac{b}{k} \rfloor}{\sum_{d|\text{gcd}\left( i,j \right)}{\mu \left( d \right)}}}} \\ =&amp;\sum_{k=1}^{\min \left( a,b \right)}{f\left( k \right) \sum_{i=1}^{\lfloor \frac{a}{k} \rfloor}{\sum_{j=1}^{\lfloor \frac{b}{k} \rfloor}{\sum_{d=1}^{\min \left( \lfloor \frac{a}{k} \rfloor ,\lfloor \frac{b}{k} \rfloor \right)}{\mu \left( d \right) \left[ d|i \right] \left[ d|j \right]}}}} \\ =&amp;\sum_{k=1}^{\min \left( a,b \right)}{f\left( k \right) \sum_{d=1}^{\min \left( \lfloor \frac{a}{k} \rfloor ,\lfloor \frac{b}{k} \rfloor \right)}{\mu \left( d \right) \lfloor \frac{a}{kd} \rfloor \lfloor \frac{b}{kd} \rfloor}} \\ =&amp;\sum_{l=1}^{\min \left( a,b \right)}{\lfloor \frac{a}{l} \rfloor \lfloor \frac{b}{l} \rfloor \sum_{k|l}{f\left( k \right) \mu \left( \frac{l}{k} \right)}} \end{aligned} ======i=1aj=1bf[gcd(i,j)]k=1min(a,b)i=1aj=1bf(k)[gcd(i,j)=k]k=1min(a,b)f(k)i=1kaj=1kb[gcd(i,j)=1]k=1min(a,b)f(k)i=1kaj=1kbdgcd(i,j)μ(d)k=1min(a,b)f(k)i=1kaj=1kbd=1min(ka,kb)μ(d)[di][dj]k=1min(a,b)f(k)d=1min(ka,kb)μ(d)kdakdbl=1min(a,b)lalbklf(k)μ(kl)

g ( l ) = ∑ k ∣ l f ( k ) μ ( l k ) g(l)=\sum_{k|l}{f\left( k \right) \mu \left( \frac{l}{k} \right)} g(l)=klf(k)μ(kl),则我们的任务就是将 g ( l ) g(l) g(l)前缀和筛出来。

此时,我们不妨先打表,求出 g ( l ) g(l) g(l) 前几百项的值。

可以发现, f ( 1 ) = 0 f(1)=0 f(1)=0 f ( p 1 k p 2 k . . . p l k ) = ( − 1 ) l + 1 f(p_1^kp_2^k...p_l^k)=(-1)^{l+1} f(p1kp2k...plk)=(1)l+1, f ( o t h e r s ) = 0 f(others)=0 f(others)=0

于是,我们可以先用线性筛筛出 f ( l ) = − μ ( l ) f(l)=-\mu(l) f(l)=μ(l) f ( 1 ) = 0 f(1)=0 f(1)=0)。

之后,枚举所有满足 f ( d ) ≠ 0 f(d) \ne 0 f(d)̸=0 d d d暴力更新 f ( d k ) = f ( d ) f(d^k)=f(d) f(dk)=f(d)

然后,就可以线性地求出 f ( l ) f(l) f(l)前缀和

预处理时间复杂度 O ( n + n log ⁡ n ) O(n+n \log n) O(n+nlogn)

最后,我们可以 O ( n ) O(\sqrt n) O(n )分块,求解出最终的值。

12.3 代码

bool isnotprime[maxn];
int prime[maxn], mu[maxn];
int prefix[maxn];
int cnt = 0;

void linearsieve(int range)
{
    mu[1] = 0;
    for(int i = 2; i <= range; i++)
    {
        if(!isnotprime[i])
        {
            prime[++cnt] = i;
            mu[i] = 1;
        }
        for(int j = 1; j <= cnt; j++)
        {
            if(i * prime[j] > range)    break;
            isnotprime[i * prime[j]] = true;
            if(i % prime[j] == 0)
            {
                mu[i * prime[j]] = 0;
                break;
            }
            else
            {
                mu[i * prime[j]] = -mu[i];
            }
        }
    }
}

int main()
{
    int t, a, b;

    linearsieve(10000000);
    int tot = 0;
    for(int i = 1; i <= 10000000; i++)
    {
        if(!mu[i])  continue;
        tot++;
        int factor = i;
        while(true)
        {
            mu[factor] = mu[i];
            if(10000000 / factor < i) break;
            factor *= i;
        }
    }
    for(int i = 1; i <= 10000000; i++) prefix[i] = prefix[i - 1] + mu[i];

    scanf("%d", &t);

    while(t--)
    {
        scanf("%d%d", &a, &b);
        ll answer = 0;
        int pos = 0, last = 0;
        int minvalue = min(a, b);
        while(pos + 1 <= minvalue)
        {
            pos = min(a / (a / (pos + 1)), b / (b / (pos + 1)));
            answer += 1LL * (prefix[pos] - prefix[last]) * (a / pos) * (b / pos);
            last = pos;
        }
        printf("%lld\n", answer);
    }
    return 0;
}

13. BZOJ - 3561

13.1 题面

给定 n , m n,m n,m,求 ∑ i = 1 n ∑ j = 1 m lcm ( i , j ) gcd ( i , j ) \sum_{i=1}^n{\sum_{j=1}^m{\text{lcm}\left( i,j \right) ^{\text{gcd}\left( i,j \right)}}} i=1nj=1mlcm(i,j)gcd(i,j) 1 0 9 + 7 10^9+7 109+7 之后的值。

共有 T ( 1 ≤ T ≤ 3 ) T(1 \le T \le 3) T(1T3) 组数据。

数据范围: 1 ≤ n , m ≤ 5 ⋅ 1 0 5 1 \le n,m \le 5 \cdot 10^5 1n,m5105

13.2 解题过程

∑ i = 1 n ∑ j = 1 m lcm ( i , j ) gcd ( i , j ) = ∑ i = 1 n ∑ j = 1 m ( i j gcd ( i , j ) ) gcd ( i , j ) = ∑ k = 1 min ⁡ ( n , m ) ∑ i = 1 n ∑ j = 1 m ( i j k ) k [ gcd ( i , j ) = k ] = ∑ k = 1 min ⁡ ( n , m ) ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ m k ⌋ ( i j k ) k [ gcd ( i , j ) = 1 ] = ∑ k = 1 min ⁡ ( n , m ) ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ m k ⌋ ( i j k ) k ∑ d = 1 min ⁡ ( ⌊ n k ⌋ , ⌊ m k ⌋ ) [ d ∣ i ] [ d ∣ j ] μ ( d ) = ∑ k = 1 min ⁡ ( n , m ) k k ∑ d = 1 min ⁡ ( ⌊ n k ⌋ , ⌊ m k ⌋ ) μ ( d ) ∑ i = 1 ⌊ n k ⌋ i k [ d ∣ i ] ∑ j = 1 ⌊ m k ⌋ j k [ d ∣ j ] = ∑ k = 1 min ⁡ ( n , m ) k k ∑ d = 1 min ⁡ ( ⌊ n k ⌋ , ⌊ m k ⌋ ) μ ( d ) ∑ i = 1 ⌊ n k d ⌋ ( d i ) k ∑ j = 1 ⌊ m k d ⌋ ( d j ) k = ∑ k = 1 min ⁡ ( n , m ) k k ∑ d = 1 min ⁡ ( ⌊ n k ⌋ , ⌊ m k ⌋ ) μ ( d ) ⋅ d 2 k ∑ i = 1 ⌊ n k d ⌋ i k ∑ j = 1 ⌊ m k d ⌋ j k \begin{aligned} &amp;\sum_{i=1}^n{\sum_{j=1}^m{\text{lcm}\left( i,j \right) ^{\text{gcd}\left( i,j \right)}}} \\ =&amp;\sum_{i=1}^n{\sum_{j=1}^m{\left( \frac{ij}{\text{gcd}\left( i,j \right)} \right) ^{\text{gcd}\left( i,j \right)}}} \\ =&amp;\sum_{k=1}^{\min \left( n,m \right)}{\sum_{i=1}^n{\sum_{j=1}^m{\left( \frac{ij}{k} \right) ^k\left[ \text{gcd}\left( i,j \right) =k \right]}}} \\ =&amp;\sum_{k=1}^{\min \left( n,m \right)}{\sum_{i=1}^{\lfloor \frac{n}{k} \rfloor}{\sum_{j=1}^{\lfloor \frac{m}{k} \rfloor}{\left( ijk \right) ^k\left[ \text{gcd}\left( i,j \right) =1 \right]}}} \\ =&amp;\sum_{k=1}^{\min \left( n,m \right)}{\sum_{i=1}^{\lfloor \frac{n}{k} \rfloor}{\sum_{j=1}^{\lfloor \frac{m}{k} \rfloor}{\left( ijk \right) ^k\sum_{d=1}^{\min \left( \lfloor \frac{n}{k} \rfloor ,\lfloor \frac{m}{k} \rfloor \right)}{\left[ d|i \right] \left[ d|j \right] \mu \left( d \right)}}}} \\ =&amp;\sum_{k=1}^{\min \left( n,m \right)}{k^k\sum_{d=1}^{\min \left( \lfloor \frac{n}{k} \rfloor ,\lfloor \frac{m}{k} \rfloor \right)}{\mu \left( d \right) \sum_{i=1}^{\lfloor \frac{n}{k} \rfloor}{i^k\left[ d|i \right] \sum_{j=1}^{\lfloor \frac{m}{k} \rfloor}{j^k\left[ d|j \right]}}}} \\ =&amp;\sum_{k=1}^{\min \left( n,m \right)}{k^k\sum_{d=1}^{\min \left( \lfloor \frac{n}{k} \rfloor ,\lfloor \frac{m}{k} \rfloor \right)}{\mu \left( d \right) \sum_{i=1}^{\lfloor \frac{n}{kd} \rfloor}{\left( di \right) ^k\sum_{j=1}^{\lfloor \frac{m}{kd} \rfloor}{\left( dj \right) ^k}}}} \\ =&amp;\sum_{k=1}^{\min \left( n,m \right)}{k^k\sum_{d=1}^{\min \left( \lfloor \frac{n}{k} \rfloor ,\lfloor \frac{m}{k} \rfloor \right)}{\mu \left( d \right) \cdot d^{2k}\sum_{i=1}^{\lfloor \frac{n}{kd} \rfloor}{i^k\sum_{j=1}^{\lfloor \frac{m}{kd} \rfloor}{j^k}}}} \end{aligned} =======i=1nj=1mlcm(i,j)gcd(i,j)i=1nj=1m(gcd(i,j)ij)gcd(i,j)k=1min(n,m)i=1nj=1m(kij)k[gcd(i,j)=k]k=1min(n,m)i=1knj=1km(ijk)k[gcd(i,j)=1]k=1min(n,m)i=1knj=1km(ijk)kd=1min(kn,km)[di][dj]μ(d)k=1min(n,m)kkd=1min(kn,km)μ(d)i=1knik[di]j=1kmjk[dj]k=1min(n,m)kkd=1min(kn,km)μ(d)i=1kdn(di)kj=1kdm(dj)kk=1min(n,m)kkd=1min(kn,km)μ(d)d2ki=1kdnikj=1kdmjk

我们可以预处理出所有的 k k k^k kk d 2 k d^{2k} d2k 以及 i k i^k ik前缀和

注意预处理时应该使用递推的思想,不能使用快速幂,否则会多一个 log ⁡ \log log 的复杂度。

计算答案时,第一维枚举 k k k第二维枚举 d d d,总的时间复杂度 O ( n log ⁡ n ) O(n \log n) O(nlogn)

处理方法参见下面代码。

13.3 代码

vector <ll> po[maxn], po2[maxn];
ll pk[maxn];
bool isnotprime[maxn];
ll prime[maxn];
int mu[maxn];
int cnt = 0;

ll pow_mod(ll a, ll b)
{
    ll res = 1;
    a = a % Mod;
    while(b)
    {
        if(b & 1)  res = (res * a) % Mod;
        b = b >> 1;
        a = (a * a) % Mod;
    }
    return res;
}

void mobiussieve(ll range)
{
    mu[1] = 1;
    for(ll i = 2; i <= range; i++)
    {
        if(!isnotprime[i])
        {
            prime[++cnt] = i;
            mu[i] = -1 + Mod;
        }
        for(int j = 1; j <= cnt; j++)
        {
            if(i * prime[j] > range)    break;
            isnotprime[i * prime[j]] = true;
            if(i % prime[j] == 0)
            {
                mu[i * prime[j]] = 0;
                break;
            }
            else mu[i * prime[j]] = (-mu[i] + Mod) % Mod;
        }
    }
}

int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    int maxvalue = max(n, m);
    mobiussieve(maxvalue);
    for(int i = 1; i <= maxvalue; i++)
    {
        ll sum = 0;
        po[i].pb(0);
        po2[i].pb(0);
        for(int j = 1; j <= maxvalue / i; j++)
        {
            ll temp;
            if(i == 1)  temp = j;
            else        temp = po2[i - 1][j] * 1LL * j % Mod;
            sum = (sum + temp) % Mod;
            po[i].pb(sum);
            po2[i].pb(temp);
        }
        pk[i] = pow_mod(1LL * i, 1LL * i);
    }
    int range = min(n, m);
    ll answer = 0;
    for(int k = 1; k <= range; k++)
    {
        int range2 = min(n / k, m / k);
        ll sum = 0;
        for(int d = 1; d <= range2; d++)
        {
            ll temp1 = 1LL * mu[d] * po2[k][d] % Mod * po2[k][d] % Mod;
            ll temp2 = po[k][n / k / d] * po[k][m / k / d] % Mod;
            sum = (sum + temp1 * temp2 % Mod) % Mod;
        }
        sum = sum * pk[k] % Mod; 
        answer = (answer + sum) % Mod;
    }
    printf("%lld\n", answer);
    return 0;
}

14. BZOJ - 3529

14.1 题面

∑ i = 1 n ∑ j = 1 m [ σ [ gcd ( i , j ) ] ≤ a ] ⋅ σ [ gcd ( i , j ) ] \sum_{i=1}^n{\sum_{j=1}^m{\left[ \sigma \left[ \text{gcd}\left( i,j \right) \right] \le a \right] \cdot \sigma \left[ \text{gcd}\left( i,j \right) \right]}} i=1nj=1m[σ[gcd(i,j)]a]σ[gcd(i,j)] 2 31 2^{31} 231 取模之后的值。

对于每组数据,一共有 q q q 组询问。

数据范围: 1 ≤ n , m ≤ 1 0 5 1 \le n,m \le 10^5 1n,m105, 1 ≤ q ≤ 2 ⋅ 1 0 4 1 \le q \le 2 \cdot 10^4 1q2104, ∣ a ∣ ≤ 1 0 9 |a| \le 10^9 a109

14.2 解题过程

我们先考虑没有 a a a 的限制的情况,即求 ∑ i = 1 n ∑ j = 1 m σ [ gcd ( i , j ) ] \sum_{i=1}^n{\sum_{j=1}^m{\sigma \left[ \text{gcd}\left( i,j \right) \right]}} i=1nj=1mσ[gcd(i,j)] 的值。
∑ i = 1 n ∑ j = 1 m σ [ gcd ( i , j ) ] = ∑ k = 1 min ⁡ { n , m } ∑ i = 1 n ∑ j = 1 m σ ( k ) [ gcd ( i , j ) = k ] = ∑ k = 1 min ⁡ { n , m } ∑ p = 1 min ⁡ { ⌊ n k ⌋ , ⌊ m k ⌋ } μ ( p ) ⋅ ⌊ n p k ⌋ ⌊ m p k ⌋ = ∑ l = 1 min ⁡ { m , n } ⌊ n l ⌋ ⌊ m l ⌋ ∑ k ∣ l σ ( k ) μ ( k ) , l = p k \begin{aligned} &amp;\sum_{i=1}^n{\sum_{j=1}^m{\sigma \left[ \text{gcd}\left( i,j \right) \right]}} \\ &amp;=\sum_{k=1}^{\min \left\{ n,m \right\}}{\sum_{i=1}^n{\sum_{j=1}^m{\sigma \left( k \right) \left[ \text{gcd}\left( i,j \right) =k \right]}}} \\ &amp;=\sum_{k=1}^{\min \left\{ n,m \right\}}{\sum_{p=1}^{\min \left\{ \lfloor \frac{n}{k} \rfloor ,\lfloor \frac{m}{k} \rfloor \right\}}{\mu \left( p \right) \cdot \lfloor \frac{n}{pk} \rfloor \lfloor \frac{m}{pk} \rfloor}} \\ &amp;=\sum_{l=1}^{\min \left\{ m,n \right\}}{\lfloor \frac{n}{l} \rfloor \lfloor \frac{m}{l} \rfloor \sum_{k|l}{\sigma \left( k \right) \mu \left( k \right)}},l=pk \end{aligned} i=1nj=1mσ[gcd(i,j)]=k=1min{n,m}i=1nj=1mσ(k)[gcd(i,j)=k]=k=1min{n,m}p=1min{kn,km}μ(p)pknpkm=l=1min{m,n}lnlmklσ(k)μ(k),l=pk
如果没有 a a a 的限制,则本题的做法 1.2 1.2 1.2 节相同,则其时间复杂度 O ( q ⋅ ( m + n ) ) O(q \cdot (\sqrt m + \sqrt n)) O(q(m +n ))

加上 a a a 的限制之后,本题就不能像上面那样容易去做了。

我们考虑离线处理所有的查询,之后一起输出答案。

对所有的查询,按照 a a a 从小到大进行排序。

同时,对于任意的 x ∈ [ 1 , 1 0 5 ] x \in [1,10^5] x[1,105],我们需要预处理出所有的 μ ( x ) \mu{(x)} μ(x) σ ( x ) \sigma(x) σ(x),用结构体存储自变量和函数值,之后按照函数值从小到大进行排序。

f ( x ) = ∑ k ∣ x σ ( k ) μ ( k ) [ σ ( k ) ≤ a ] f\left( x \right) =\sum_{k|x}{\sigma \left( k \right) \mu \left( k \right) \left[ \sigma \left( k \right) \le a \right]} f(x)=kxσ(k)μ(k)[σ(k)a],其前缀和 p r e f i x [ x ] prefix[x] prefix[x]

对于查询 i i i a i ≥ a i − 1 a_i \ge a_{i-1} aiai1,在执行到该查询之前,所有满足 σ ( k ) ≤ a i − 1 \sigma{(k)} \le a_{i-1} σ(k)ai1 σ ( k ) μ ( k ) \sigma \left( k \right) \mu \left( k \right) σ(k)μ(k) 均已经被贡献到 p r e f i x prefix prefix 中。

此时,我们仅需将所有满足 a i − 1 &lt; σ ( k ) ≤ a i a_{i-1} &lt; \sigma{(k)} \le a_{i} ai1<σ(k)ai σ ( k ) μ ( k ) \sigma \left( k \right) \mu \left( k \right) σ(k)μ(k) 贡献到 p r e f i x prefix prefix 中即可,注意要处理 k k k 的所有小于等于 1 0 5 10^5 105倍数

p r e f i x prefix prefix 可使用树状数组进行维护。

N = 1 0 5 N=10^5 N=105,则总的时间复杂度 O ( N log ⁡ 2 N + q N log ⁡ N ) O(N \log^2 N+q \sqrt N \log N) O(Nlog2N+qN logN)

对于取模问题,直接让 int 自然溢出即可,最终答案若为负数,则直接对 $2^{31}-1 =2147483647 $ 进行与运算即可。

具体实现细节可参考 14.3 14.3 14.3 节的代码

14.3 代码

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;

bool isnotprime[maxn];
int prime[maxn], prefix[maxn];
int mu[maxn];
int cnt = 0;
struct node
{
    int id;
    int value;
} sigma[maxn];
struct data
{
    int id, n, m, a;
} query[maxn];
bool operator < (data a, data b)
{
    return a.a < b.a;
}
bool operator < (node a, node b)
{
    return a.value < b.value;
}
void mobiussieve(int range)
{
    mu[1] = 1;
    for(int i = 2; i <= range; i++)
    {
        if(!isnotprime[i])
        {
            prime[++cnt] = i;
            mu[i] = -1;
        }
        for(int j = 1; j <= cnt; j++)
        {
            if(i * prime[j] > range)    break;
            isnotprime[i * prime[j]] = true;
            if(i % prime[j] == 0)
            {
                mu[i * prime[j]] = 0;
                break;
            }
            else mu[i * prime[j]] = -mu[i];
        }
    }
}

int lowbit(int x)
{
    return x & (-x);
}

void add(int pos, int value)
{
    while(pos <= 100000)
    {
        prefix[pos] += value;
        pos += lowbit(pos);
    }
    return;
}

int querysum(int pos)
{
    int res = 0;
    while(pos >= 1)
    {
        res += prefix[pos];
        pos -= lowbit(pos);
    }
    return res;
}

int ans[maxn];
int main()
{
    int q;
    scanf("%d", &q);

    for(int i = 1; i <= q; i++)
    {
        scanf("%d%d%d", &query[i].n, &query[i].m, &query[i].a);
        query[i].id = i;
    }

    sort(query + 1, query + 1 + q);

    mobiussieve(100000);

    for(int i = 1; i <= 100000; i++)
    {
        for(int j = 1; j <= 100000 / i; j++)
        {
            sigma[i * j].value += i;
        }
    }

    sort(sigma + 1, sigma + 1 + 100000);

    int pos = 0;
    for(int i = 1; i <= q; i++)
    {
        int a = query[i].a;
        int n = query[i].n;
        int m = query[i].m;
        int id = query[i].id;
        while(pos + 1 <= 100000 && sigma[pos + 1].value <= a)
        {
            pos++;
            for(int k = 1; k * sigma[pos].id <= 100000; k++)
            {
                add(k * sigma[pos].id, sigma[pos].value * mu[k]);
            }
        }
        int answer = 0;
        int pos2 = 0, last = 0;
        int range = min(n, m);
        while(pos2 + 1 <= range)
        {
            pos2 = min(n / (n / (pos2 + 1)), m / (m / (pos2 + 1)));
            answer += (n / pos2) * (m / pos2) * (querysum(pos2) - querysum(last));
            last = pos2;
        }
        answer &= 2147483647;
        ans[id] = answer;
    }

    for(int i = 1; i <= q; i++) printf("%d\n", ans[i]);
    
    return 0;
}

15. 2019 ICPC - 南昌邀请赛 - 网络预选赛 - G tsy’s number

15.1 题面


∑ i = 1 n ∑ j = 1 n ∑ k = 1 n φ ( i ) φ ( j 2 ) φ ( k 3 ) φ ( i ) φ ( j ) φ ( k ) φ ( gcd ( i , j , k ) ) \sum_{i=1}^n{\sum_{j=1}^n{\sum_{k=1}^n{\frac{\varphi \left( i \right) \varphi \left( j^2 \right) \varphi \left( k^3 \right)}{\varphi \left( i \right) \varphi \left( j \right) \varphi \left( k \right)}\varphi \left( \text{gcd}\left( i,j,k \right) \right)}}} i=1nj=1nk=1nφ(i)φ(j)φ(k)φ(i)φ(j2)φ(k3)φ(gcd(i,j,k))
2 30 2^{30} 230 取模之后的值。

共有 T ( 1 ≤ T ≤ 1 0 4 ) T(1 \le T \le 10^4) T(1T104) 组查询, 1 ≤ n ≤ 1 0 7 ​ 1 \le n \le 10^7​ 1n107

15.2 解题过程

15.2.1 Tricks

( 1 ) (1) (1) 对于任意的整数 m , n m,n m,n,都有
φ ( m n ) = φ ( m ) φ ( n ) ⋅ gcd ( m , n ) φ ( gcd ( m , n ) ) \varphi \left( mn \right) =\varphi \left( m \right) \varphi \left( n \right) \cdot \frac{\text{gcd}\left( m,n \right)}{\varphi \left( \text{gcd}\left( m,n \right) \right)} φ(mn)=φ(m)φ(n)φ(gcd(m,n))gcd(m,n)
因此,
φ ( j 2 ) = φ 2 ( j ) ⋅ j φ ( j ) = j ⋅ φ ( j ) \varphi \left( j^2 \right) =\varphi ^2\left( j \right) \cdot \frac{j}{\varphi \left( j \right)}=j\cdot \varphi \left( j \right) φ(j2)=φ2(j)φ(j)j=jφ(j)

φ ( k 3 ) = φ ( k ) ⋅ φ ( k 2 ) ⋅ k φ ( k ) = k ⋅ φ ( k 2 ) = k 2 ⋅ φ ( k ) \varphi \left( k^3 \right) =\varphi \left( k \right) \cdot \varphi \left( k^2 \right) \cdot \frac{k}{\varphi \left( k \right)}=k\cdot \varphi \left( k^2 \right) =k^2\cdot \varphi \left( k \right) φ(k3)=φ(k)φ(k2)φ(k)k=kφ(k2)=k2φ(k)

( 2 ) (2) (2) 幂和公式
∑ i = 1 n i = n ( n + 1 ) 2 \sum_{i=1}^n{i}=\frac{n\left( n+1 \right)}{2} i=1ni=2n(n+1)

∑ i = 1 n i 2 = n ( n + 1 ) ( 2 n + 1 ) 6 \sum_{i=1}^n{i^2}=\frac{n\left( n+1 \right) \left( 2n+1 \right)}{6} i=1ni2=6n(n+1)(2n+1)

15.2.2 推导过程

∑ i = 1 n ∑ j = 1 n ∑ k = 1 n φ ( i ) φ ( j 2 ) φ ( k 3 ) φ ( i ) φ ( j ) φ ( k ) φ ( gcd ( i , j , k ) ) = ∑ i = 1 n ∑ j = 1 n ∑ k = 1 n φ ( j 2 ) φ ( k 3 ) φ ( j ) φ ( k ) φ ( gcd ( i , j , k ) ) = ∑ i = 1 n ∑ j = 1 n ∑ k = 1 n j ⋅ φ ( j ) ⋅ k 2 ⋅ φ ( k ) φ ( j ) φ ( k ) φ ( gcd ( i , j , k ) ) = ∑ i = 1 n ∑ j = 1 n ∑ k = 1 n j ⋅ k 2 ⋅ φ ( gcd ( i , j , k ) ) = ∑ t = 1 n ∑ i = 1 n ∑ j = 1 n ∑ k = 1 n j ⋅ k 2 ⋅ φ ( t ) [ gcd ( i , j , k ) = t ] = ∑ t = 1 n ∑ i = 1 ⌊ n t ⌋ ∑ j = 1 ⌊ n t ⌋ ∑ k = 1 ⌊ n t ⌋ t 3 ⋅ j ⋅ k 2 ⋅ φ ( t ) [ gcd ( i , j , k ) = 1 ] = ∑ t = 1 n t 3 φ ( t ) ∑ i = 1 ⌊ n t ⌋ ∑ j = 1 ⌊ n t ⌋ j ∑ k = 1 ⌊ n t ⌋ k 2 [ gcd ( i , j , k ) = 1 ] = ∑ t = 1 n t 3 φ ( t ) ∑ i = 1 ⌊ n t ⌋ ∑ j = 1 ⌊ n t ⌋ j ∑ k = 1 ⌊ n t ⌋ k 2 ∑ d = 1 ⌊ n t ⌋ μ ( d ) [ d ∣ i ] [ d ∣ j ] [ d ∣ k ] = ∑ t = 1 n t 3 φ ( t ) ∑ i = 1 ⌊ n t ⌋ [ d ∣ i ] ∑ j = 1 ⌊ n t ⌋ j [ d ∣ j ] ∑ k = 1 ⌊ n t ⌋ k 2 [ d ∣ k ] ∑ d = 1 ⌊ n t ⌋ μ ( d ) = ∑ t = 1 n t 3 φ ( t ) ∑ d = 1 ⌊ n t ⌋ μ ( d ) ⌊ n t d ⌋ ⋅ ⌊ n t d ⌋ ( ⌊ n t d ⌋ + 1 ) 2 ⋅ ⌊ n t d ⌋ ( ⌊ n t d ⌋ + 1 ) ( 2 ⋅ ⌊ n t d ⌋ + 1 ) 6 = ∑ l = 1 n ⌊ n l ⌋ ⋅ ⌊ n l ⌋ ( ⌊ n l ⌋ + 1 ) 2 ⋅ ⌊ n l ⌋ ( ⌊ n l ⌋ + 1 ) ( 2 ⋅ ⌊ n l ⌋ + 1 ) 6 ⋅ l 3 ∑ d ∣ l μ ( d ) φ ( l d ) , l = t d \begin{aligned} &amp;\sum_{i=1}^n{\sum_{j=1}^n{\sum_{k=1}^n{\frac{\varphi \left( i \right) \varphi \left( j^2 \right) \varphi \left( k^3 \right)}{\varphi \left( i \right) \varphi \left( j \right) \varphi \left( k \right)}\varphi \left( \text{gcd}\left( i,j,k \right) \right)}}} \\ =&amp;\sum_{i=1}^n{\sum_{j=1}^n{\sum_{k=1}^n{\frac{\varphi \left( j^2 \right) \varphi \left( k^3 \right)}{\varphi \left( j \right) \varphi \left( k \right)}\varphi \left( \text{gcd}\left( i,j,k \right) \right)}}} \\ =&amp;\sum_{i=1}^n{\sum_{j=1}^n{\sum_{k=1}^n{\frac{j\cdot \varphi \left( j \right) \cdot k^2\cdot \varphi \left( k \right)}{\varphi \left( j \right) \varphi \left( k \right)}\varphi \left( \text{gcd}\left( i,j,k \right) \right)}}} \\ =&amp;\sum_{i=1}^n{\sum_{j=1}^n{\sum_{k=1}^n{j\cdot k^2\cdot \varphi \left( \text{gcd}\left( i,j,k \right) \right)}}} \\ =&amp;\sum_{t=1}^n{\sum_{i=1}^n{\sum_{j=1}^n{\sum_{k=1}^n{j\cdot k^2\cdot \varphi \left( t \right) \left[ \text{gcd}\left( i,j,k \right) =t \right]}}}} \\ =&amp;\sum_{t=1}^n{\sum_{i=1}^{\lfloor \frac{n}{t} \rfloor}{\sum_{j=1}^{\lfloor \frac{n}{t} \rfloor}{\sum_{k=1}^{\lfloor \frac{n}{t} \rfloor}{t^3\cdot j\cdot k^2\cdot \varphi \left( t \right) \left[ \text{gcd}\left( i,j,k \right) =1 \right]}}}} \\ =&amp;\sum_{t=1}^n{t^3\varphi \left( t \right) \sum_{i=1}^{\lfloor \frac{n}{t} \rfloor}{\sum_{j=1}^{\lfloor \frac{n}{t} \rfloor}{j\sum_{k=1}^{\lfloor \frac{n}{t} \rfloor}{k^2\left[ \text{gcd}\left( i,j,k \right) =1 \right]}}}} \\ =&amp;\sum_{t=1}^n{\begin{array}{c} t^3\varphi \left( t \right) \sum_{i=1}^{\lfloor \frac{n}{t} \rfloor}{\sum_{j=1}^{\lfloor \frac{n}{t} \rfloor}{j\sum_{k=1}^{\lfloor \frac{n}{t} \rfloor}{k^2\sum_{d=1}^{\lfloor \frac{n}{t} \rfloor}{\mu \left( d \right) \left[ d|i \right] \left[ d|j \right] \left[ d|k \right]}}}}\\ \end{array}} \\ =&amp;\sum_{t=1}^n{\begin{array}{c} t^3\varphi \left( t \right) \sum_{i=1}^{\lfloor \frac{n}{t} \rfloor}{\left[ d|i \right] \sum_{j=1}^{\lfloor \frac{n}{t} \rfloor}{j\left[ d|j \right] \sum_{k=1}^{\lfloor \frac{n}{t} \rfloor}{k^2\left[ d|k \right] \sum_{d=1}^{\lfloor \frac{n}{t} \rfloor}{\mu \left( d \right)}}}}\\ \end{array}} \\ =&amp;\sum_{t=1}^n{\begin{array}{c} t^3\varphi \left( t \right) \sum_{d=1}^{\lfloor \frac{n}{t} \rfloor}{\mu \left( d \right) \lfloor \frac{n}{td} \rfloor \cdot \frac{\lfloor \frac{n}{td} \rfloor \left( \lfloor \frac{n}{td} \rfloor +1 \right)}{2}\cdot \frac{\lfloor \frac{n}{td} \rfloor \left( \lfloor \frac{n}{td} \rfloor +1 \right) \left( 2\cdot \lfloor \frac{n}{td} \rfloor +1 \right)}{6}}\\ \end{array}} \\ =&amp;\sum_{l=1}^n{\lfloor \frac{n}{l} \rfloor \cdot \frac{\lfloor \frac{n}{l} \rfloor \left( \lfloor \frac{n}{l} \rfloor +1 \right)}{2}\cdot \frac{\lfloor \frac{n}{l} \rfloor \left( \lfloor \frac{n}{l} \rfloor +1 \right) \left( 2\cdot \lfloor \frac{n}{l} \rfloor +1 \right)}{6}\cdot l^3\sum_{d|l}{\mu \left( d \right) \varphi \left( \frac{l}{d} \right)}},l=td \end{aligned} ==========i=1nj=1nk=1nφ(i)φ(j)φ(k)φ(i)φ(j2)φ(k3)φ(gcd(i,j,k))i=1nj=1nk=1nφ(j)φ(k)φ(j2)φ(k3)φ(gcd(i,j,k))i=1nj=1nk=1nφ(j)φ(k)jφ(j)k2φ(k)φ(gcd(i,j,k))i=1nj=1nk=1njk2φ(gcd(i,j,k))t=1ni=1nj=1nk=1njk2φ(t)[gcd(i,j,k)=t]t=1ni=1tnj=1tnk=1tnt3jk2φ(t)[gcd(i,j,k)=1]t=1nt3φ(t)i=1tnj=1tnjk=1tnk2[gcd(i,j,k)=1]t=1nt3φ(t)i=1tnj=1tnjk=1tnk2d=1tnμ(d)[di][dj][dk]t=1nt3φ(t)i=1tn[di]j=1tnj[dj]k=1tnk2[dk]d=1tnμ(d)t=1nt3φ(t)d=1tnμ(d)tdn2tdn(tdn+1)6tdn(tdn+1)(2tdn+1)l=1nln2ln(ln+1)6ln(ln+1)(2ln+1)l3dlμ(d)φ(dl),l=td

f ( l ) = l 3 ∑ d ∣ l μ ( d ) φ ( l d ) f\left( l \right) =l^3\sum_{d|l}{\mu \left( d \right) \varphi \left( \frac{l}{d} \right)} f(l)=l3dlμ(d)φ(dl),显然 f ( l ) f(l) f(l)积性函数,我们可以用线性筛 O ( n ) O(n) O(n) 地求出其前缀和

15.3 需要注意的点

为防止向下取整,平方和应该用下面的方法去求:

ll sum2(ll n)
{
    ll tt1 = n, tt2 = n + 1, tt3 = (2LL * n + 1);
    if(tt1 % 2 == 0)        tt1 /= 2;
    else if(tt2 % 2 == 0)   tt2 /= 2;
    else                    tt3 /= 2;
    if(tt1 % 3 == 0)        tt1 /= 3;
    else if(tt2 % 3 == 0)   tt2 /= 3;
    else                    tt3 /= 3;
    return tt1 * tt2 % Mod * tt3 % Mod;
}
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值