Description
题目链接:Codeforces 1110C
定义函数 $f(a)$ 的值为:
给出 $q$ 个询问,每个询问为一个整数 $a_i$。你需要对于每个询问,求出 $f(a_i)$ 的值。
数据范围:$1\le q\le 10^3$,$2\le a_i\le 2^{25}-1$
Solution
首先我们可以找到 $f(a)$ 的上界:找到满足 $2^x-1\ge a$ 的最小的 $x$,那么上界就是 $2^x-1$。我们考虑能够构造出这个上界。
我们发现,$\gcd(0,x)=x$,我们用 $\text{bit}_{a,i}$ 表示 $a$ 的第 $i$ 位。构造方式如下:
- 当 $\text{bit}_{a,i}=0$ 时,$\text{bit}_{b,i}=1$。
- 当 $\text{bit}_{a,i}=1$ 时,$\text{bit}_{b,i}=0$。
通过如上方式,我们可以使得 $a\oplus b=2^x-1$,使得 $a\ \&\ b=0$,这样一来我们就构造出了上界。
但是考虑特殊情况:当 $a=2^x-1$ 时,这样构造得到的 $b=0$,不满足条件。那么我们考虑异或和与的本质,发现当 $a$ 的所有二进制位都是 $1$ 时,$a\oplus b$ 相当于在 $a$ 中消去 $b$ 的二进制位为 $1$ 的位,$a\ \&\ b$ 相当于在 $a$ 中保留 $b$ 的二进制位为 $1$ 的位。那么我们有:
经过分析,我们可以得到:当 $b$ 为 $a$ 的最大因子的时候,$\gcd(a,b)$ 的值最大(可以直接暴力预处理出所有 $a=2^x-1$ 的函数值)。
当然这题的最好做法当然是打表啦!
时间复杂度:$O(q\log a_i)$(预处理)或 $O(q\sqrt{a_i})$(枚举因子)
Code
1 |
|