cf1553F. Pairwise Modulo

Posted Jozky86

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cf1553F. Pairwise Modulo相关的知识,希望对你有一定的参考价值。

cf1553F. Pairwise Modulo

题意:

给你一个数组a,a由n个不同的数组成,让你求出对应的数组p
数组p的定义为:
p k = ∑ 1 ≤ i , j ≤ k a i m o d    a j p_{k}=\\sum_{1\\leq i,j\\leq k}a_{i} \\mod a_{j} pk=1i,jkaimodaj

题解:

官方题解
首先我们需要拜托mod操作,一个常用公式:
x m o d    y = x − y ∗ ⌊ x y ⌋ x \\mod y = x - y * \\lfloor \\frac{x}{y} \\rfloor xmody=xyyx
直接求p比较麻烦,我们规定i,j一个先后顺序,我们将 p k p_{k} pk分成 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}=\\sum_{1\\leq i,j\\leq k,i>j}a_{i} \\mod 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\\leq i,j\\leq k,i<j}a_{i} \\mod a_{j} tk=1i,jk,i<jaimodaj
也就是 s k s_{k} sk求的是编号大的数mod编号小的数的和, t k t_{k} tk则正好相反。
怎么求 s k s_{k} sk?
s k = s k − 1 + ∑ i = 1 k − 1 a k m o d    a i = s k − 1 + ∑ i = 1 k − 1 ( a k − a i ∗ ⌊ a k a i ⌋ ) s_{k}=s_{k-1}+\\sum_{i=1}^{k-1}a_{k} \\mod a_{i}=s_{k-1}+\\sum_{i=1}^{k-1}(a_{k}-a_{i}*\\lfloor\\frac{a_{k}}{a_{i}} \\rfloor) sk=sk1+i=1k1akmodai=sk1+i=1k1(akaiaiak)
我们将 a k a_{k} ak提出来会得到:
s k = s k − 1 + a k ∗ ( k − 1 ) − ∑ i = 1 k − 1 ( a i ∗ ⌊ a k a i ⌋ ) s_{k}=s_{k-1}+a_{k}*(k-1)-\\sum_{i=1}^{k-1}(a_{i}*\\lfloor \\frac{a_{k}}{a_{i}} \\rfloor) sk=sk1+ak(k1)i=1k1(aiaiak)
现在问题就是 ∑ i = 1 k − 1 ( a i ∗ ⌊ a k a i ⌋ ) \\sum_{i=1}^{k-1}(a_{i}*\\lfloor \\frac{a_{k}}{a_{i}} \\rfloor) i=1k1(aiaiak)咋求
我们现在开始确定 a i a_{i} ai,然后看其对所有 s k s_{k} sk,k>i的贡献

  1. 对于所有的 a k a_{k} ak [ a i , 2 ∗ a i ) [a_{i},2*a_{i}) [ai,2ai)贡献是 − a i -a_{i} ai
  2. 对于所有的 a k a_{k} ak [ 2 ∗ a i , 3 ∗ a i ) [2*a_{i},3*a_{i}) [2ai,3ai)贡献是 − 2 ∗ a i -2*a_{i} 2以上是关于cf1553F. Pairwise Modulo的主要内容,如果未能解决你的问题,请参考以下文章

    cf1553C. Penalty

    cf1553D. Backspace

    cf1553E. Permutation Shift

    sklearn中的pairwise_distance

    pairwise的使用

    pairwise的使用