牛客练习赛77
牛客练习赛77
C - 小G的约数
预备知识
整数分块
整数分块用来求类似如下的问题。
\(给定正整数n,求 \sum_{i=1}^n[\frac{n}{i}]\)
\(性质1:设f(n) = [\frac{n}{i}], f是单调不增函数。\)
证明
\(对任意的x,f(x+1) - f(x) = [\frac{n}{x+1}] - [\frac{n}{x}]。\)
\(由于\frac{n}{x+1} < \frac{n}{x},那么[\frac{n}{x+1}] <= [\frac{n}{x}]。\)
\(那么f(x+1) - f(x) <= 0。 得证。\)
\(性质2:设集合P,自然数K。若任意的x \in P都有f(x) = K,一定有P = [l, r]。\)
\(换言之,下取整函数值相等的自变量一定落在连续区间内。\)
\(由性质1即得。\)
\(性质3:f(x) \ge 1。\)
\(这是由于x <= n。\)
\(性质4:给定n,任意给出正整数n,以及某一连续区间的左端点l,一定可以\)
\(求出这个区间的[\frac{n}{i}],以及右端点r。设[\frac{n}{i}] = C。\)
\(证明:\)
\(1. 证明由n与l一定可以求出C。\)
\(由于l \in [l, r],由性质2,f(l) = C。\)
\(2. 证明由n与l一定可以求出r。\)
\(我们定义W=[\frac{n}{C}],可以证明r=W。\)
\((1) 证明W \in [l, r]。\)
\(由定义,若f(W) = C, 那么C+1>\frac{n}{W} \ge C,即\)
\(n \ge C \times W 与\)
\(n < (C+1) \times W 同时成立\)
\(带入W,有\)
\(n \ge C \times [\frac{n}{C}] ①\)
\(n < (C+1) \times [\frac{n}{C}] ②\)
\(①等价于 \frac{n}{C} \ge [\frac{n}{C}],显然成立\)
\(②等价于\frac{n}{C+1} < [\frac{n}{C}]。\)
\(将等号左边变形,易有\)
\(1 - \frac{1}{C+1} < [\frac{n}{C}],即\)
\(1 < [\frac{n}{C}] + \frac{1}{C+1}。\)
\(由性质3,[\frac{n}{C}] \ge 1,不等式成立。\)
\(于是,W \in [l, r]得证。\)
\((2) 证明 \forall x \in [l, r], x \le W。\)
\(即证明最大性。\)
\(即证,\forall x, x \le [\frac{n}{[\frac{n}{x}]}]。\)
\(由于x \le n, 易知n = kx + t,其中t < x。\)
\(原式等价于\forall x, x \le [\frac{kx+t}{[\frac{kx+t}{x}]}]\)
\(由于\frac{kx+t}{x} = k + \frac{t}{x} < k + 1\)
\([\frac{kx+t}{x}] = k。\)
\(原式等价于\forall x, x \le [\frac{kx+t}{k}]\)
\(而[\frac{kx+t}{k}] = [x+\frac{t}{k}] \ge [x]\)
\(故原式等价于\forall x, [\frac{kx+t}{k}] \ge [x] = x,得证。\)
\((1)(2)证毕。\)
算法实现
以
\(给定正整数n,求 \sum_{i=1}^n[n/i]\)
为例。
ll ans = 0;
for(int l=1, r; l<=n; l=r+1)
{
r = n / (n / l);
ans += (r - l + 1) * (n / l);
}
复杂度分析
\(对于i < \sqrt{n},最多有\sqrt{n}种答案;\)
\(对于i>\sqrt{n},由于\frac{n}{i} < \sqrt{n},也最多只有\sqrt{n}种答案。\)
\(循环最多只会迭代2\sqrt{n}次,时间复杂度O(2\sqrt{n}) = O(\sqrt{n})。\)
D - 小G的LY数对
预备知识
手写hashmap
挖坑
XOR
性质1 \(a \oplus b = c \oplus d 等价于 a \oplus c = b \oplus d\)
性质2 $a \oplus b = c 等价于a \oplus c = b $
实现
思路假了,这题卡STL
可以手写一个hashmap,不想手写hashmap的话可以这样解决
\(题目等价于 x \oplus y = (1 << i) \oplus (1 << j)\)
\(由性质1 等价于 x \oplus (1<<i) = y \oplus (1<<j)\)
\(可以用map存一下所有x \oplus (1<<i)的值,然后再去枚举y \oplus (1<<j)\)
\(这里出现了一个问题,满足 x \oplus (1<<i) = y \oplus (1<<j)的未必满足 i \neq j,而想要结果是\)
\(异或存在两个1的,如果i = j了那么结果里只有一个1\)
\(考虑所有x, y的可能性\)
\(A. x = y, i \neq j, 此时x \oplus (1<<i) \neq y \oplus (1<<j). 结果中不会计算。\)
\(B. x \neq y, i \neq j,此时分两种情况\)
\(1. x \oplus (1<<i) = y \oplus (1<<j)。 参算到结果中,是合法的结果。对于上面叙述的枚举顺序,容易发现对于每一对x, y是要遍历两次的。\)
\(即,x \oplus (1<<i) = y \oplus (1<<j), 与y \oplus (1<<j) = x \oplus (1<<i)\)
\(2. x \oplus (1<<i) \neq y \oplus (1<<j)。 结果中不会计算\)
\(C. x = y, i = j, 此时x \oplus (1<<i) = y \oplus (1<<j)。参算到结果中,但是不合法的结果。对于上面叙述的枚举顺序,\)
\(每一个x = y只会被遍历一次。即,x \oplus (1<<i) = y \oplus (1<<j), 与y \oplus (1<<j) = x \oplus (1<<i),但x = y。\)
\(D. x \neq y, i = j, 此时x \oplus (1<<i) \neq y \oplus (1<<j). 结果中不会计算。\)
\(综上所述,对于x \oplus (1<<i) = y \oplus (1<<j)的情况中,x = y 且 i = j的被算了一次,x\neq 且i \neq j的被算了两次\)
\(在枚举y \oplus (1<<j)更新ans之后,减去i = j的次数,再除以2就好了。\)
\(x = y 且 i = j的次数容易想到是x=y的组数 * i的个数\)
这个思路说人话就是
\(给a消去一个1,给b再消去一个1,看看最后相等的组数\)
\(消去的1相同的那些组是不合法的,此时找a = b的对数即可\)
\(消的过程中难免因为顺序会出现重复,/2即可\)

浙公网安备 33010602011771号