【数论】整数分块及详细证明

ThinkofBlank

2018-12-27 11:00:02

Personal

一.复杂度证明

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

的种类的数量在\sqrt{x}

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

1.当d\leq\sqrt{x}时:

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

2.当d>\sqrt{x}时:

[\frac{x}{d}]<\sqrt{x}

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

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

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

二.一堆引理及证明

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

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

使得[\frac{x}{l}]=[\frac{x}{r}][\frac{x}{l}]\neq[\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}]=Ci,其集合一定是一段连续的整数区间

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

证明一:

[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}\geq\frac{Cx}{x}=C

假设\frac{x}{A}\geq C+1

AC\leq x-A

AC=x-k

又∵k<A

∴假设不成立

\frac{x}{A}<C+1

综上所述:C\leq \frac{x}{A}<C+1

[\frac{x}{A}]=C

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

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

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

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

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

AC+C=x-g

又∵AC=x-k

C=k-g

0\leq k,g<C

∴假设不成立

∴命题得证

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

A满足r的所有性质

r=Ar=[\frac{x}{C}]=[\frac{x}{[\frac{x}{l}]}]

∴引理三得证

三.实现方法

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

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

那么之后的区间呢?

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

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

PS:一个区间的定义:具有一个范围[l,r],且满足对于\forall i\in [l,r] 都有[\frac{x}{i}]=[\frac{x}{l}]且对于\forall i\notin [l,r]都有[\frac{x}{i}]\neq[\frac{x}{l}]