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=1i,jkaimodaj

题目分析:直接求解比较困难,需要对模型进行两步转换:

首先取模运算, a   m o d   b a \\bmod b amodb 等价于 x − x ∗ ⌊ y x ⌋ x-x*\\lfloor \\frac{y}{x} \\rfloor xxxy

其次给原式子中的 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=1i,jk,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=1i,jk,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=1i,jk,i>j(aimodaj)=sk1+i<k(akmodai)=sk1+i<k(akaiaiak)=sk1+ak(k1)i<k(aiaiak)

现在问题是如何快速求解 ∑ i < k ( a i ∗ ⌊ a k a i ⌋ ) \\sum_{i < k}(a_i*\\lfloor \\frac{a_k}{a_i} \\rfloor) i<k(aiaiak)

需要注意到,题目中任意两个数都是不同的,还需要注意到,向下取整运算是一个阶段性运算,类似于整除分块,即:

  1. a k ∈ [ a i , 2 ∗ a i ) a_k\\in [a_i,2*a_i) ak[ai,2ai),贡献为 a i a_i ai
  2. a k ∈ [ 2 ∗ a i , 3 ∗ a i ) a_k\\in [2*a_i,3*a_i) ak[2ai,3ai),贡献为 2 ∗ a i 2*a_i 2ai
  3. a k ∈ [ t ∗ a i , ( t + 1 ) ∗ a i ) a_k\\in [t*a_i,(t+1)*a_i) ak[tcodeforces上怎么看测试数据

    如何看codeforces做了多少题

    codeforces上怎么看测试数据

    codeforces比赛后怎么看题解和答案

    codeforces是啥?

    codeforces Codeforces 650A Watchmen