欢迎访问本菜鸡的独立博客: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]=∑d∣nμ(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=1a∑j=1b[gcd(i,j)=d]=∑i=1⌊da⌋∑j=1⌊db⌋[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=1maxvalue∑i,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=1n∑d=1⌊kn⌋f=∑l=1n∑k∣lf=∑l=1n∑d∣lf,之后一般可推出一个积性函数乘上一些式子
( 6 ) (6) (6) ∑ d ∣ n 1 = ∑ d = 1 n [ d ∣ n ] \sum_{d|n}{1}=\sum_{d=1}^n{\left[ d|n \right]} ∑d∣n1=∑d=1n[d∣n] 表示 [ 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 ∑d∣nd=∑d=1n[d∣n]⋅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=1a∑j=1b[gcd(i,j)=d] 的值。
数据范围: 1 ≤ d ≤ a , b ≤ 50000 1 \le d \le a, b \le 50000 1≤d≤a,b≤50000,共 T ( 1 ≤ T ≤ 50000 ) T(1 \le T \le 50000) T(1≤T≤50000) 组数据。
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=1∑aj=1∑b[gcd(i,j)=d]=i=1∑⌊da⌋j=1∑⌊db⌋[gcd(i,j)=1]=i=1∑⌊da⌋j=1∑⌊db⌋d′∣gcd(i,j)∑μ(d′)=i=1∑⌊da⌋j=1∑⌊db⌋d′=1∑min(⌊da⌋,⌊db⌋)[d′∣gcd(i,j)]μ(d)=i=1∑⌊da⌋j=1∑⌊db⌋d′=1∑min(⌊da⌋,⌊db⌋)[d′∣i][d′∣j]μ(d)=d′=1∑min(⌊da⌋,⌊db⌋)μ(d)⋅⎝⎛i=1∑⌊da⌋[d′∣i]⎠⎞⋅⎝⎛j=1∑⌊db⌋[d′∣j]⎠⎞=d′=1∑min(⌊da⌋,⌊db⌋)μ(d)⌊d′⌊da⌋⌋⌊d′⌊db⌋⌋
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=ab∑j=cd[gcd(i,j)=k] 的值。
数据范围: 1 ≤ n , k ≤ 5 ⋅ 1 0 4 1 \le n,k \le 5 \cdot 10^4 1≤n,k≤5⋅104, 1 ≤ a ≤ b ≤ 5 ⋅ 1 0 4 1 \le a \le b \le 5 \cdot 10^4 1≤a≤b≤5⋅104, 1 ≤ c ≤ d ≤ 5 ⋅ 1 0 4 1 \le c \le d \le 5 \cdot 10^4 1≤c≤d≤5⋅104。
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=1a∑j=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(a−1,d)−sum(b,c−1)+sum(a−1,c−1)
每个
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(1≤T≤3000) 组数据。
数据范围: 1 ≤ c , d ≤ 1 0 5 1 \le c,d \le 10^5 1≤c,d≤105。
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=1a∑j=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 < n ≤ 2 32 0 < n \le 2^{32} 0<n≤232。
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} &\sum_{i=1}^n{\text{gcd}\left( i,n \right)} \\ =&\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) \\ =&\sum_{k|n}{k\sum_{i=1}^{\frac{n}{k}}{\left[ \text{gcd}\left( i,n \right) =1 \right]}} \\ =&\sum_{k|n}{k\cdot \varphi \left( \frac{n}{k} \right)} \end{aligned} ===i=1∑ngcd(i,n)k∣n∑i=1∑n[gcd(i,n)=k]⋅k,(k∣gcd(i,n))k∣n∑ki=1∑kn[gcd(i,n)=1]k∣n∑k⋅φ(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=1n∑j=1mlcm(i,j) 的值,答案对 20101009 20101009 20101009 取模。
数据范围: 1 ≤ n , m ≤ 1 0 7 1 \le n,m \le 10^7 1≤n,m≤107。
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} &\sum_{i=1}^n{\sum_{j=1}^m{\text{lcm}\left( i,j \right)}} \\ &=\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}}} \\ &=\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) \\ &=\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) \\ &=\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) \\ &=\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) \\ &=\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) \\ &=\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=1∑nj=1∑mlcm(i,j)=k=1∑min(n,m)i=1∑n∑j=1mki⋅j[gcd(i,j)=k]=k=1∑min(n,m)i=1∑⌊kn⌋j=1∑⌊km⌋ijk[gcd(i,j)=1],(i←k⋅i,j←k⋅j)=k=1∑min(n,m)kd=1∑min(⌊kn⌋,⌊km⌋)μ(d)⎝⎛i=1∑⌊kn⌋[d∣i]⋅i⎠⎞⎝⎛j=1∑⌊km⌋[d∣j]⋅j⎠⎞=k=1∑min(n,m)kd=1∑min(⌊kn⌋,⌊km⌋)μ(d)⎝⎛p=1∑⌊kdn⌋dp⎠⎞⎝⎛q=1∑⌊kdm⌋dq⎠⎞,(i←dp,j←dq)=k=1∑min(n,m)kd=1∑min(⌊kn⌋,⌊km⌋)d2⋅μ(d)⎝⎛p=1∑⌊kdn⌋p⎠⎞⎝⎛q=1∑⌊kdm⌋q⎠⎞=k=1∑min(n,m)kd=1∑min(⌊kn⌋,⌊km⌋)d2⋅μ(d)(2(1+⌊kdn⌋)⋅⌊kdn⌋)(2(1+⌊kdm⌋)⋅⌊kdm⌋)=l=1∑min(n,m)(2(1+⌊ln⌋)⋅⌊ln⌋)(2(1+⌊lm⌋)⋅⌊lm⌋)d∣l∑μ(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=1n∑j=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 1≤n,m≤107, 1 ≤ T ≤ 1 0 4 1 \le T \le 10^4 1≤T≤104。
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=1n∑j=1nμ(gcd(i,j)) 的值。
数据范围: 1 ≤ n ≤ 1 0 7 1 \le n \le 10^7 1≤n≤107。
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} &\sum_{i=1}^n{\sum_{j=1}^n{\mu \left( \text{gcd}\left( i,j \right) \right)}} \\ &=\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]}}} \\ &=\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]}}} \\ &=\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)}}}} \\ &=\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)}}}} \\ &=\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) \\ &=\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} \\ &=\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=1∑nj=1∑nμ(gcd(i,j))=k=1∑ni=1∑nj=1∑nμ(k)[gcd(i,j)=k]=k=1∑ni=1∑⌊kn⌋j=1∑⌊kn⌋μ(k)[gcd(i,j)=1]=k=1∑nμ(k)i=1∑⌊kn⌋j=1∑⌊kn⌋d∣gcd(i,j)∑μ(d)=k=1∑nμ(k)i=1∑⌊kn⌋j=1∑⌊kn⌋d=1∑⌊kn⌋[d∣i][d∣j]μ(d)=k=1∑nμ(k)d=1∑⌊kn⌋μ(d)⎝⎛i=1∑⌊kn⌋[d∣i]⎠⎞⎝⎛j=1∑⌊kn⌋[d∣j]⎠⎞=k=1∑nμ(k)d=1∑⌊kn⌋μ(d)⌊kdn⌋2=l=1∑n⌊ln⌋2k∣l∑μ(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)=k∣l∑μ(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,k≥2,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 )    is a prime ] \sum_{i=1}^n{\sum_{j=1}^n{\left[ \text{gcd}\left( i,j \right) \,\,\text{is a prime} \right]}} ∑i=1n∑j=1n[gcd(i,j)is a prime] 的值。
数据范围: 1 ≤ n ≤ 1 0 7 1 \le n \le 10^7 1≤n≤107。
8.2 解题过程
∑ i = 1 n ∑ j = 1 n [ gcd ( i , j )    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} &\sum_{i=1}^n{\sum_{j=1}^n{\left[ \text{gcd}\left( i,j \right) \,\,\text{is a prime} \right]}} \\ &=\sum_{p=2}^{maxprime}{\sum_{i=1}^n{\sum_{j=1}^n{\left[ \text{gcd}\left( i,j \right) =p \right]}}} \\ &=\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]}}} \\ &=\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)}}}} \\ &=\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=1∑nj=1∑n[gcd(i,j)is a prime]=p=2∑maxprimei=1∑nj=1∑n[gcd(i,j)=p]=p=2∑maxprimei=1∑⌊pn⌋j=1∑⌊pn⌋[gcd(i,j)=1]=p=2∑maxprimei=1∑⌊pn⌋j=1∑⌊pn⌋k=1∑⌊pn⌋[k∣i][k∣j]⋅μ(k)=p=2∑maxprimek=1∑⌊pn⌋μ(k)⋅⌊pkn⌋2
注意到,
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
n→∞limi=1∑nin=logn
因此,总的时间复杂度为
O
(
664579
⋅
log
n
)
O(664579 \cdot \log n)
O(664579⋅logn)。
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=1n∑j=1mgcd(i,j)k 对 1 0 9 + 7 10^9+7 109+7 取模之后的值。
共有 T ( 1 ≤ T ≤ 2000 ) T(1\le T \le 2000) T(1≤T≤2000) 组数据。
数据范围: 1 ≤ n , m , k ≤ 5 ⋅ 1 0 6 1 \le n,m,k \le 5 \cdot 10^6 1≤n,m,k≤5⋅106。
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} &\sum_{i=1}^n{\sum_{j=1}^m{\text{gcd}\left( i,j \right) ^k}} \\ =&\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}}} \\ =&\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]}}} \\ =&\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}} \\ =&\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=1∑nj=1∑mgcd(i,j)kq=1∑min(n,m)i=1∑nj=1∑m[gcd(i,j)=q]⋅qkq=1∑min(n,m)qki=1∑⌊qn⌋j=1∑⌊qm⌋[gcd(i,j)=1]q=1∑min(n,m)qkd=1∑min(⌊qn⌋,⌊qm⌋)μ(d)⌊qdn⌋⌊qdm⌋l=1∑min(n,m)⌊ln⌋⌊lm⌋q∣l∑qkμ(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)=∑q∣lqkμ(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)=pk−1, 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)=pkl−pk(l−1)=pk(l−1)(pk−1)。
因此我们可以利用线性筛求出 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 )    is a prime ] \sum_{i=1}^n{\sum_{j=1}^m{\left[ \text{gcd}\left( i,j \right) \,\,\text{is a prime} \right]}} ∑i=1n∑j=1m[gcd(i,j)is a prime] 的值,有 T T T 组询问。
数据范围: 1 ≤ n , m ≤ 1 0 7 1 \le n,m \le 10^7 1≤n,m≤107, 1 ≤ T ≤ 1 0 4 1 \le T \le 10^4 1≤T≤104。
10.2 解题过程
本题为 BZOJ - 2818 的多组询问版本。
∑
i
=
1
n
∑
j
=
1
m
[
gcd
(
i
,
j
)
  
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
  
is prime
\begin{aligned} &\sum_{i=1}^n{\sum_{j=1}^m{\left[ \text{gcd}\left( i,j \right) \,\,\text{is a prime} \right]}} \\ &=\sum_{p=2}^{maxprime}{\sum_{i=1}^n{\sum_{j=1}^m{\left[ \text{gcd}\left( i,j \right) =p \right]}}} \\ &=\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]}}} \\ &=\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)}}}} \\ &=\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}} \\ &=\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=1∑nj=1∑m[gcd(i,j)is a prime]=p=2∑maxprimei=1∑nj=1∑m[gcd(i,j)=p]=p=2∑maxprimei=1∑⌊pn⌋j=1∑⌊pm⌋[gcd(i,j)=1]=p=2∑maxprimei=1∑⌊pn⌋j=1∑⌊pm⌋k=1∑min{⌊pn⌋,⌊pm⌋}[k∣i][k∣j]⋅μ(k)=p=2∑maxprimek=1∑min{⌊pn⌋,⌊pm⌋}μ(k)⋅⌊pkn⌋⌊pkm⌋=l=1∑min{n,m}⌊ln⌋⌊lm⌋p∣l∑μ(pl),pis prime
设
f
(
l
)
=
∑
p
∣
l
μ
(
l
p
)
f\left( l \right) =\sum_{p|l}{\mu \left( \frac{l}{p} \right)}
f(l)=∑p∣lμ(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...pn−1pn2)=μ(p1p2...pn−1pn),
设 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(T⋅min{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} 1≤l≤1014, 1 ≤ r ≤ 1.6 ⋅ 1 0 14 1 \le r \le 1.6 \cdot 10^{14} 1≤r≤1.6⋅1014。
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} &\sum_{i=1}^n{d\left( i \right)} \\ =&\sum_{i=1}^n{\sum_{d|i}{1}} \\ =&\sum_{k=1}^n{\sum_{d=1}^{\lfloor \frac{n}{k} \rfloor}{1}},i=kd \\ =&\sum_{k=1}^n{\lfloor \frac{n}{k} \rfloor} \end{aligned} ===i=1∑nd(i)i=1∑nd∣i∑1k=1∑nd=1∑⌊kn⌋1,i=kdk=1∑n⌊kn⌋
可以通过根号分块得到答案。
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=1a∑j=1bf(gcd(i,j)) 的值。
其中 f ( n ) f(n) f(n) 表示 n n n 所含质因子的最大幂指数。
有 T T T 组输入,满足 T ≤ 1 0 4 T \le 10^4 T≤104。
数据范围: 1 ≤ a , b ≤ 1 0 7 1 \le a,b \le 10^7 1≤a,b≤107。
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} &\sum_{i=1}^a{\sum_{j=1}^b{f\left[ \text{gcd}\left( i,j \right) \right]}} \\ =&\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]}}} \\ =&\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]}}} \\ =&\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)}}}} \\ =&\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]}}}} \\ =&\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}} \\ =&\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=1∑aj=1∑bf[gcd(i,j)]k=1∑min(a,b)i=1∑aj=1∑bf(k)⋅[gcd(i,j)=k]k=1∑min(a,b)f(k)i=1∑⌊ka⌋j=1∑⌊kb⌋[gcd(i,j)=1]k=1∑min(a,b)f(k)i=1∑⌊ka⌋j=1∑⌊kb⌋d∣gcd(i,j)∑μ(d)k=1∑min(a,b)f(k)i=1∑⌊ka⌋j=1∑⌊kb⌋d=1∑min(⌊ka⌋,⌊kb⌋)μ(d)[d∣i][d∣j]k=1∑min(a,b)f(k)d=1∑min(⌊ka⌋,⌊kb⌋)μ(d)⌊kda⌋⌊kdb⌋l=1∑min(a,b)⌊la⌋⌊lb⌋k∣l∑f(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)=∑k∣lf(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=1n∑j=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(1≤T≤3) 组数据。
数据范围: 1 ≤ n , m ≤ 5 ⋅ 1 0 5 1 \le n,m \le 5 \cdot 10^5 1≤n,m≤5⋅105。
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} &\sum_{i=1}^n{\sum_{j=1}^m{\text{lcm}\left( i,j \right) ^{\text{gcd}\left( i,j \right)}}} \\ =&\sum_{i=1}^n{\sum_{j=1}^m{\left( \frac{ij}{\text{gcd}\left( i,j \right)} \right) ^{\text{gcd}\left( i,j \right)}}} \\ =&\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]}}} \\ =&\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]}}} \\ =&\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)}}}} \\ =&\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]}}}} \\ =&\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}}}} \\ =&\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=1∑nj=1∑mlcm(i,j)gcd(i,j)i=1∑nj=1∑m(gcd(i,j)ij)gcd(i,j)k=1∑min(n,m)i=1∑nj=1∑m(kij)k[gcd(i,j)=k]k=1∑min(n,m)i=1∑⌊kn⌋j=1∑⌊km⌋(ijk)k[gcd(i,j)=1]k=1∑min(n,m)i=1∑⌊kn⌋j=1∑⌊km⌋(ijk)kd=1∑min(⌊kn⌋,⌊km⌋)[d∣i][d∣j]μ(d)k=1∑min(n,m)kkd=1∑min(⌊kn⌋,⌊km⌋)μ(d)i=1∑⌊kn⌋ik[d∣i]j=1∑⌊km⌋jk[d∣j]k=1∑min(n,m)kkd=1∑min(⌊kn⌋,⌊km⌋)μ(d)i=1∑⌊kdn⌋(di)kj=1∑⌊kdm⌋(dj)kk=1∑min(n,m)kkd=1∑min(⌊kn⌋,⌊km⌋)μ(d)⋅d2ki=1∑⌊kdn⌋ikj=1∑⌊kdm⌋jk
我们可以预处理出所有的 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=1n∑j=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 1≤n,m≤105, 1 ≤ q ≤ 2 ⋅ 1 0 4 1 \le q \le 2 \cdot 10^4 1≤q≤2⋅104, ∣ a ∣ ≤ 1 0 9 |a| \le 10^9 ∣a∣≤109。
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=1n∑j=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} &\sum_{i=1}^n{\sum_{j=1}^m{\sigma \left[ \text{gcd}\left( i,j \right) \right]}} \\ &=\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]}}} \\ &=\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}} \\ &=\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=1∑nj=1∑mσ[gcd(i,j)]=k=1∑min{n,m}i=1∑nj=1∑mσ(k)[gcd(i,j)=k]=k=1∑min{n,m}p=1∑min{⌊kn⌋,⌊km⌋}μ(p)⋅⌊pkn⌋⌊pkm⌋=l=1∑min{m,n}⌊ln⌋⌊lm⌋k∣l∑σ(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)=∑k∣xσ(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} ai≥ai−1,在执行到该查询之前,所有满足 σ ( k ) ≤ a i − 1 \sigma{(k)} \le a_{i-1} σ(k)≤ai−1 的 σ ( k ) μ ( k ) \sigma \left( k \right) \mu \left( k \right) σ(k)μ(k) 均已经被贡献到 p r e f i x prefix prefix 中。
此时,我们仅需将所有满足 a i − 1 < σ ( k ) ≤ a i a_{i-1} < \sigma{(k)} \le a_{i} ai−1<σ(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+qNlogN)。
对于取模问题,直接让 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=1∑nj=1∑nk=1∑nφ(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(1≤T≤104) 组查询, 1 ≤ n ≤ 1 0 7 1 \le n \le 10^7 1≤n≤107。
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=1∑ni=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=1∑ni2=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} &\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)}}} \\ =&\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)}}} \\ =&\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)}}} \\ =&\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)}}} \\ =&\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]}}}} \\ =&\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]}}}} \\ =&\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]}}}} \\ =&\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}} \\ =&\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}} \\ =&\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}} \\ =&\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=1∑nj=1∑nk=1∑nφ(i)φ(j)φ(k)φ(i)φ(j2)φ(k3)φ(gcd(i,j,k))i=1∑nj=1∑nk=1∑nφ(j)φ(k)φ(j2)φ(k3)φ(gcd(i,j,k))i=1∑nj=1∑nk=1∑nφ(j)φ(k)j⋅φ(j)⋅k2⋅φ(k)φ(gcd(i,j,k))i=1∑nj=1∑nk=1∑nj⋅k2⋅φ(gcd(i,j,k))t=1∑ni=1∑nj=1∑nk=1∑nj⋅k2⋅φ(t)[gcd(i,j,k)=t]t=1∑ni=1∑⌊tn⌋j=1∑⌊tn⌋k=1∑⌊tn⌋t3⋅j⋅k2⋅φ(t)[gcd(i,j,k)=1]t=1∑nt3φ(t)i=1∑⌊tn⌋j=1∑⌊tn⌋jk=1∑⌊tn⌋k2[gcd(i,j,k)=1]t=1∑nt3φ(t)∑i=1⌊tn⌋∑j=1⌊tn⌋j∑k=1⌊tn⌋k2∑d=1⌊tn⌋μ(d)[d∣i][d∣j][d∣k]t=1∑nt3φ(t)∑i=1⌊tn⌋[d∣i]∑j=1⌊tn⌋j[d∣j]∑k=1⌊tn⌋k2[d∣k]∑d=1⌊tn⌋μ(d)t=1∑nt3φ(t)∑d=1⌊tn⌋μ(d)⌊tdn⌋⋅2⌊tdn⌋(⌊tdn⌋+1)⋅6⌊tdn⌋(⌊tdn⌋+1)(2⋅⌊tdn⌋+1)l=1∑n⌊ln⌋⋅2⌊ln⌋(⌊ln⌋+1)⋅6⌊ln⌋(⌊ln⌋+1)(2⋅⌊ln⌋+1)⋅l3d∣l∑μ(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)=l3∑d∣lμ(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;
}