zoukankan      html  css  js  c++  java
  • 【数论】整数分块及详细证明

    update:添加了数学公式markdown

    洛谷博客地址:https://www.luogu.com.cn/blog/KingofNight/post-shuo-lun-zheng-shuo-fen-kuai-ji-yang-xi-zheng-ming

    一.复杂度证明

    引理一:对于任意一个正整数(x),([frac{x}{d}](1leq dleq x))

    的种类的数量在(sqrt{x})

    证明:将(d)分为小于等于(sqrt{x})与大于(sqrt{x})的两部分

    1.当(dleqsqrt{x})时:

    假设每个([frac{x}{d}])都不一样,最多也就(sqrt{x})个值

    2.当(d>sqrt{x})时:

    ([frac{x}{d}]<sqrt{x})

    ([frac{x}{d}])的取值同样不超过(sqrt{x})

    ∴个数在根号(x)级(不超过(2*sqrt{x}))

    即,整数分块的复杂度为(O(sqrt{x}))

    二.一堆引理及证明

    引理二:对于所有使([frac{x}{i}]=C)(i),其集合一定是一段连续的整数区间

    证明:假设不是连续区间,则一定存在一个(l<t<r),

    使得([frac{x}{l}]=[frac{x}{r}])([frac{x}{l}] eq[frac{x}{t}])

    (t>l)

    ([frac{x}{t}]<[frac{x}{l}])

    (t<r)

    ([frac{x}{t}]>[frac{x}{r}])

    ([frac{x}{l}]=[frac{x}{r}])

    假设不成立

    ∴所有使([frac{x}{i}]=C)(i),其集合一定是一段连续的整数区间

    引理三:对于所有使([frac{x}{i}]=C)(i),如果其集合为([l,r]),那么我们只需要知道(l),就可以求出(C)(r)

    证明一:

    ([l,r])内所有的数都可以使([frac{x}{i}]=C)(定义)

    (C=[frac{x}{l}])

    小引理:(r=[frac{x}{[frac{x}{l}]}])

    一.证明([frac{x}{A}]=C)

    (A=[frac{x}{[frac{x}{l}]}]=[frac{x}{C}])

    所以(AC)可以表示为:

    (AC=x-k(0<=k<A,C))

    (A=frac{x-k}{C})

    (frac{x}{A}=frac{Cx}{x-k}geqfrac{Cx}{x}=C)

    假设(frac{x}{A}geq C+1)

    (ACleq x-A)

    (AC=x-k)

    又∵(k<A)

    ∴假设不成立

    (frac{x}{A}<C+1)

    综上所述:(Cleq frac{x}{A}<C+1)

    ([frac{x}{A}]=C)

    二.证明(A)为最大的使([frac{x}{i}]=C)成立的数

    (AC=x-k(0leq k<A,C))

    假设(A)不是最大令([frac{x}{i}]=C)成立的数,由引理二知:

    (A+1)一定可以使([frac{x}{i}]=C)

    ((A+1)*C=x-g(0leq g<A,C))

    (AC+C=x-g)

    又∵(AC=x-k)

    (C=k-g)

    (0leq k,g<C)

    ∴假设不成立

    ∴命题得证

    综上所述:(A=[frac{x}{C}])是最大的令([frac{x}{i}]=C)成立的数

    (A)满足r的所有性质

    (r=A)(r=[frac{x}{C}]=[frac{x}{[frac{x}{l}]}])

    ∴引理三得证

    三.实现方法

    由引理三知,我们只需要知道(l)就可以(O(1))算出区间([l,r])使得对于(forall iin [l,r])都有([frac{x}{i}]=[frac{x}{l}])且对于(forall i otin [l,r])都有([frac{x}{i}] eq[frac{x}{l}])

    而,如果我们要枚举区间([L,R])的所有整数,那么第一个区间的(l)一定是(L)!

    那么之后的区间呢?

    不就是前一个区间的"(r)"加个一嘛!

    ∴我们就可以在(sqrt{x})枚举完整个区间了!

    PS:一个区间的定义:具有一个范围[l,r],且满足对于(forall iin [l,r])都有([frac{x}{i}]=[frac{x}{l}])且对于(forall i otin [l,r])都有([frac{x}{i}] eq[frac{x}{l}])

  • 相关阅读:
    两种存储思路
    越来越浅
    我了解的前端史
    关于称赞小孩
    怎么写递归
    Python笔记(十八):协程asyncio
    网络协议笔记(一):HTTP协议基础知识
    Linux笔记(三):常用命令
    算法笔记(九):二分查找
    数据结构笔记(二):栈、队列
  • 原文地址:https://www.cnblogs.com/ThinkofBlank/p/10183838.html
Copyright © 2011-2022 走看看