zoukankan      html  css  js  c++  java
  • Solution -「ARC 123F」Insert Addition

    大约是翻译了一下官方题解?

    @Description@

    对于一个整数序列 (P=(P_{1},dots,P_{m})),定义 (f(P)) 为一个序列 (Q) 满足:

    • (Q_{i}=P_{i}+P_{i+1}),其中 (iin[1,m))
    • (f(P)=(P_{1},Q_{1},dots,P_{m-1},Q_{m-1},P_{m}))

    给出正整数 (a,b,N),其中 (a,bleqslant N),令序列 (A=(a,b)),令序列 (B) 为一下操作的结果:

    • (N) 次令 (A=f(A)).
    • 删除 (A) 中大于 (B) 的数。

    (B_{l,dots r})

    @Solution@

    ◆ The Coefficient Sequence

    构造最终的 (A) 序列的过程是这样的:

    [a,b \ a,a+b,b \ a,2a+b,a+b,a+2b,b \ a,3a+b,2a+b,3a+2b,a+b,2a+3b,a+2b,a+3b,b \ dots ]

    可以发现有对称性。此时我们先不关心 (a,b) 以及 (N) 的大小,反之,我们来观察其序列系数,也就是把每个元素看成 (xa+yb),其系数的 ((x,y)),上例的序列系数即

    [(1,0),(0,1) \ (1,0),(1,1),(0,1) \ (1,0),(2,1),(1,1),(1,2),(0,1) \ (1,0),(3,1),(2,1),(3,2),(1,1),(2,3),(1,2),(1,3),(0,1) \ dots ]

    以下我们称其为 Coefficient Sequence

    ◆ The properties of the Coefficient Sequence

    现在我们来观察 Coefficient Sequence 的性质。

    Observation 1:在 Coefficient Sequence 中相邻的两个二元组 ((x_{S},y_{S}),(x_{T},y_{T})),都有: (x_{S}y_{T}-x_{T}y_{S}=1)

    使用数学归纳法(induction)即证。

    Observation 2:对于两个 两个二元组 ((x_{S},y_{S}),(x_{T},y_{T})),如果他们满足 (x_{S}y_{T}-x_{T}y_{S}=1),那么它们在 Coefficient Sequence 中相邻,即 Observation 1 是充要条件

    不会证,大概意会一下吧

    Observation 3:对于一个二元组 ((x,y)),如果 (gcd(x,y)=1),那么 ((x,y)) 会出现在 Coefficient Sequence 中。

    比较显然,以至于官方题解没有给出证明。

    Observation 4:在任意时刻,所有在 Coefficient Sequence 中的 ((x,y)) 总是呈从左到右的关于值 (frac{y}{x}) 递增(令 (frac{x}{0}=infty))。

    ◆ The sequence (B) in other words

    现在描述序列 (B) 变得更加容易,现在我们这样描述它:

    对于所有二元组 ((x,y)) 满足 (x,y,s.t.x,yinmathbb{N},gcd(x,y)=1,ax+byleqslant N),我们对其按 (frac{y}{x}) 排序后形成一个二元组序列 ({(x_{i},y_{i})}),则 (B_{i}=ax_{i}+by_{i})

    ◆ Computing (B_{n})

    现在我们来考虑原问题的简化版,我们来计算 (B_{n})。让我们把这个描述成一个计数问题(通过二分 (frac{y}{x})):

    给定正整数 (a,b,N),以及一个有理数 (c)(二分的值),求二元组 ((x,y) eq(0,0)) 的数量,其中 ((x,y)) 满足

    • (ax+byleqslant N)
    • (gcd(x,y)=1)
    • (frac{y}{x}leqslant c)

    我们令 (F(N)) 为以上问题的答案,同时令 (G(N)) 为去掉 (gcd(x,y)=1) 限制的答案。(G(N)) 的式子可以很方便的写出来: (G(N)=sum_{y=1}^{N}max{lfloorfrac{N-by}{a} floor-lfloorfrac{y}{c} floor+1,0}),同时我们还可以写出 (G(N)=sum_{d=1}^{N}F(lfloorfrac{N}{d} floor))。那么再根据 Möbius inversion formula,我们可以表示出 (F(N)=sum_{d=1}^{N}mu(d)G(lfloorfrac{N}{d} floor))。于是计算该问题答案的复杂度就是 (mathcal{O}(N))

    但是此时我们知道了 (B_{n})(frac{y_{n}}{x_{n}}),怎么知道 ((x_{n},y_{n})) 呢?我们可以再做一个二分。观察出这样一个规律:若令 (l=(1,0),r=(0,1)),那么中间位置就是 (l+r)。于是我们可以再次做一个二分,利用 (frac{y}{x}) 单调来做 check。

    顺带一提,这个还可以使用 类欧几里得 来计算。

    ◆ Computing (B_{l,dots,r})

    可以发现这个东西可以知二求一,于是求出 (B_{l},B_{l+1}) 就行了。当然也可以求出 (B_{l},B_{r}) 然后做二分搜索。

  • 相关阅读:
    GoLang中面向对象的三大特性
    Go常用功能总结一阶段
    GO语言基础之并发concurrency
    GO语言基础之error
    GO语言基础之reflect反射
    GO语言基础之interface
    GO语言基础之method
    GO语言基础之struct
    GO语言基础map与函数
    GO语言基础条件、跳转、Array和Slice
  • 原文地址:https://www.cnblogs.com/orchid-any/p/15033167.html
Copyright © 2011-2022 走看看