神仙题一道
$\Large\mathcal{Description}$
无耻地丢一个链接 $\Large{☞}$ $\Large{戳这里}$
题目内容严重超出我的表达范围
$\Large\mathcal{Solution}$
首先,有这样的结论 $:$
- $k$ 为奇数时,$x \times 2^y$ $mod$ $k$ 成环
- $k$ 为偶数且 $x$ 所含因子 $2$ 的个数比 $k$ 多时,$x \times 2^y$ $mod$ $k$ 成环
归纳一下就是,$x$ 所含因子 $2$ 的个数比 $k$ 多(或相等)时,$x \times 2^y$ $mod$ $k$ 成环。($k$ 为奇数时,所含因子 $2$ 的个数为 $0$) 相关证明会在最后给出。
所以,$1-n$ 每一个数都只有两种状态 $:$ 在一条链上 $or$ 不在链上
我们可以找出每一条链,并对这些链进行维护(线段树或者树状数组)。而对于不在链上的点,可以暴力跳到链上,每次最多跳 $O(log_{2}n)$ 次。
这就是本题的大体思路。
但这还没完。
我们注意到 $n$ 有 $1e9$ ,这显然不能直接维护 时间、空间两开($bao$)花($zha$)
但可以发现由于是链,所以一条链可以由一个数确定。于是我们可以倍增预处理出每个点所在的链,之后用动态开点线段树对链进行维护。
完美!时间、空间两开花!
$\Large\mathcal{Code}$
1 |
|
$\Large\mathcal{Extended}$
结论 $:$ $x$ 所含因子 $2$ 的个数比 $k$ 多(或相等)时,$x \times 2^y$ $mod$ $k$ 成环
因为 $x$ 的变化只与最后一个非零位的数值有关。所以这里讨论的 $x$ 取值为 $1 \le x \le k - 1$。
$x + lowbitv(x)$ 相当于 $x \times 2$,每一次运算 $x$ 的因子 $2$ 的个数都会多一,其他不变,所以该位不会变成零 (不会变成 $k$ 的倍数)。
有根据欧拉定理 $a^{\phi(p)}$ $\equiv$ $1$ ($mod~p$),所以值成环。
证毕。