取整函数相关

一.取整函数的定义.

这里我们主要研究下取整函数,所以这里只定义下取整函数.

下取整函数:定义下取整函数 ⌊ x ⌋ \lfloor x\rfloor x为:
⌊ x ⌋ = max ⁡ i ∈ Z ∧ i ≤ x { i } \lfloor x\rfloor=\max_{i\in Z\wedge i\leq x}\{i\} x=iZixmax{i}



二.下取整函数的若干性质.

性质1:对于任意 m ∈ N + m\in N_+ mN+,有 ⌊ ⌊ n ⌋ x ⌋ = ⌊ n x ⌋ \left \lfloor \frac{\left \lfloor n \right \rfloor}{x} \right \rfloor=\left \lfloor \frac{n}{x} \right \rfloor xn=xn.

证明:
n = k x + r n=kx+r n=kx+r,其中 n ∈ N + , r ∈ [ 0 , x ) n\in N_+,r \in [0,x) nN+,r[0,x).
⌊ ⌊ n ⌋ x ⌋ = k + ⌊ ⌊ r ⌋ x ⌋ = k = k + ⌊ r x ⌋ = ⌊ n x ⌋ \left \lfloor \frac{\left \lfloor n \right \rfloor}{x} \right \rfloor =k+\left \lfloor \frac{\left \lfloor r \right \rfloor}{x} \right \rfloor =k=k+\left \lfloor \frac{r}{x} \right \rfloor =\left \lfloor \frac{n}{x} \right \rfloor xn=k+xr=k=k+xr=xn

证毕.

性质2:对于任意 n ∈ N + n\in N_+ nN+ ⌊ n x ⌋ \left \lfloor \frac{n}{x} \right \rfloor xn的取值只有最多 2 n 2\sqrt{n} 2n 种,其中 x ∈ N + x\in N_+ xN+.

证明:
1.当 x ≤ n x\leq \sqrt{n} xn 时,发现k的取值最多只有 n \sqrt{n} n 种了,自然 ⌊ n x ⌋ \left \lfloor \frac{n}{x} \right \rfloor xn的取值只有 n \sqrt{n} n 种.
2.当 x > n x> \sqrt{n} x>n 时,发现 ⌊ n x ⌋ ≤ n \left \lfloor \frac{n}{x} \right \rfloor\leq \sqrt{n} xnn ,所以下取整后的取值只有 n \sqrt{n} n 种.
综1,2所述,情况总共有 2 n 2\sqrt{n} 2n 种.
证毕.


三.除法分块.

考虑下面的和式:
∑ i = 1 n f ( ⌊ n i ⌋ ) \sum_{i=1}^{n}f\left(\left\lfloor\frac{n}{i}\right\rfloor\right) i=1nf(in)

假设我们能够 O ( 1 ) O(1) O(1)计算 f ( n ) f(n) f(n),则在 O ( n ) O(n) O(n)的时间复杂度内就可以求出上面的式子.

但是我们如果不满足于这个速度呢?能不能更快?

根据性质2,我们发现 ⌊ n i ⌋ \left\lfloor\frac{n}{i}\right\rfloor in只有 O ( n ) O(\sqrt{n}) O(n )种取值,而 ⌊ n i ⌋ \left\lfloor\frac{n}{i}\right\rfloor in相同时,它们对应的 f ( ⌊ n i ⌋ ) f(\left\lfloor\frac{n}{i}\right\rfloor) f(in)也是相等的,也就是说 f ( ⌊ n i ⌋ ) f(\left\lfloor\frac{n}{i}\right\rfloor) f(in)也只有 O ( n ) O(\sqrt{n}) O(n )种取值.

但是我们如何确定每种 ⌊ n i ⌋ \left\lfloor\frac{n}{i}\right\rfloor in出现了多少次呢?

显然当 k k k确定时,所有满足 ⌊ n i ⌋ = k \left\lfloor\frac{n}{i}\right\rfloor=k in=k i i i是一个区间,现在问题是如何求出区间的两个端点.

我们考虑一个做法,首先第一个区间的左端点必然为 1 1 1,而求出了右端点后,下一个区间就是这个区间的右端点 + 1 +1 +1了.

现在问题只剩下如何用左端点推出右端点了.

假设此时左端点为 l l l,右端点为 r r r,那么有 ⌊ n l ⌋ = ⌊ n r ⌋ \left\lfloor\frac{n}{l}\right\rfloor=\left\lfloor\frac{n}{r}\right\rfloor ln=rn,且 l l l最小而 r r r最大,即 n l \frac{n}{l} ln最大而 n r \frac{n}{r} rn最小.显然此时就有:
r = ⌊ n ⌊ n l ⌋ ⌋ r=\left\lfloor\frac{n}{\left\lfloor\frac{n}{l}\right\rfloor}\right\rfloor r=lnn

代码如下:

int Div_block(int n){
  int res=0;
  for (int l=1,r;l<=n;l=r+1){
    r=n/(n/l);
    res+=(r-l+1)*f(n/l);
  }
  return res;
}



四.类欧几里得算法.

咕.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值