CodeForces - 1553F Pairwise Modulo(数论+树状数组)
Posted Frozen_Guardian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces - 1553F Pairwise Modulo(数论+树状数组)相关的知识,希望对你有一定的参考价值。
题目链接:点击查看
题目大意:给出一个长度为 n n n 的序列,求 p k = ∑ 1 ≤ i , j ≤ k a i m o d a j p_k = \\sum_{1 \\le i, j \\le k} a_i \\bmod a_j pk=∑1≤i,j≤kaimodaj
题目分析:直接求解比较困难,需要对模型进行两步转换:
首先取模运算, a m o d b a \\bmod b amodb 等价于 x − x ∗ ⌊ y x ⌋ x-x*\\lfloor \\frac{y}{x} \\rfloor x−x∗⌊xy⌋
其次给原式子中的 i , j i,j i,j 规定一个先后顺序,记 s k = ∑ 1 ≤ i , j ≤ k , i > j a i m o d a j s_{k}=\\sum_{1 \\le i, j \\le k,i>j} a_i \\bmod a_j sk=∑1≤i,j≤k,i>jaimodaj, t k = ∑ 1 ≤ i , j ≤ k , i < j a i m o d a j t_{k}=\\sum_{1 \\le i, j \\le k,i<j} a_i \\bmod a_j tk=∑1≤i,j≤k,i<jaimodaj,这样 p k = s k + t k p_k=s_k+t_k pk=sk+tk
这里拿 s k s_k sk 举例说明如何求解, t k t_k tk 类似
将式子化简:
s
k
=
∑
1
≤
i
,
j
≤
k
,
i
>
j
(
a
i
m
o
d
a
j
)
=
s
k
−
1
+
∑
i
<
k
(
a
k
m
o
d
a
i
)
=
s
k
−
1
+
∑
i
<
k
(
a
k
−
a
i
∗
⌊
a
k
a
i
⌋
)
=
s
k
−
1
+
a
k
∗
(
k
−
1
)
−
∑
i
<
k
(
a
i
∗
⌊
a
k
a
i
⌋
)
s_k=\\sum_{1 \\le i, j \\le k,i>j} (a_i \\bmod a_j) \\\\ =s_{k-1}+\\sum_{i < k}(a_k \\bmod a_i) \\\\ =s_{k-1}+\\sum_{i < k}(a_k-a_i*\\lfloor \\frac{a_k}{a_i} \\rfloor) \\\\ =s_{k-1}+a_k*(k-1)-\\sum_{i < k}(a_i*\\lfloor \\frac{a_k}{a_i} \\rfloor)
sk=∑1≤i,j≤k,i>j(aimodaj)=sk−1+∑i<k(akmodai)=sk−1+∑i<k(ak−ai∗⌊aiak⌋)=sk−1+ak∗(k−1)−∑i<k(ai∗⌊aiak⌋)
现在问题是如何快速求解 ∑ i < k ( a i ∗ ⌊ a k a i ⌋ ) \\sum_{i < k}(a_i*\\lfloor \\frac{a_k}{a_i} \\rfloor) ∑i<k(ai∗⌊aiak⌋)
需要注意到,题目中任意两个数都是不同的,还需要注意到,向下取整运算是一个阶段性运算,类似于整除分块,即:
- a k ∈ [ a i , 2 ∗ a i ) a_k\\in [a_i,2*a_i) ak∈[ai,2∗ai),贡献为 a i a_i ai
- a k ∈ [ 2 ∗ a i , 3 ∗ a i ) a_k\\in [2*a_i,3*a_i) ak∈[2∗ai,3∗ai),贡献为 2 ∗ a i 2*a_i 2∗ai
- …
- a k ∈ [ t ∗ a i , ( t + 1 ) ∗ a i ) a_k\\in [t*a_i,(t+1)*a_i) ak∈[t∗codeforces上怎么看测试数据