FXJ Wiki

Back

出题症发作Blur image

魔法布袋#

有一个魔法布袋:放入 xx 枚金币,取出 f(x)f(x) 枚。把取出的 f(x)f(x) 枚再放进去,取出的会是 3x3x 枚。即:

f(f(x))=3xf(f(x)) = 3x

ff 严格递增,且 f(1)=2f(1) = 2。金币只能整数颗。

问题:给定 nn,求 f(n)f(n)

手算小值#

x=1x = 1 开始,一步步推。

  • x=1x=1f(1)=2f(1) = 2(已知),所以 f(2)=f(f(1))=3×1=3f(2) = f(f(1)) = 3 \times 1 = 3
  • x=2x=2f(2)=3f(2) = 3(已得),f(3)=f(f(2))=3×2=6f(3) = f(f(2)) = 3 \times 2 = 6
  • x=3x=3f(3)=6f(3) = 6(已得),f(6)=f(f(3))=9f(6) = f(f(3)) = 9

到这里,已知:f(1)=2,  f(2)=3,  f(3)=6,  f(6)=9f(1)=2,\; f(2)=3,\; f(3)=6,\; f(6)=9

  • x=4x=4f(3)=6<f(4)<f(6)=9f(3)=6 < f(4) < f(6)=9(严格递增),而 f(f(4))=12f(f(4)) = 12。如果 f(4)=7f(4)=7,则 f(7)=12f(7)=12;如果 f(4)=8f(4)=8,则 f(8)=12f(8)=12。继续推 x=5x=5f(4)<f(5)<f(6)=9f(4) < f(5) < f(6)=9,所以 f(5)f(5) 只能是剩下的那个。最终得到 f(4)=7,  f(5)=8f(4)=7,\; f(5)=8,进而 f(7)=12,  f(8)=15f(7)=12,\; f(8)=15

  • x=6x=6f(6)=9f(6)=9(已得),f(9)=f(f(6))=18f(9) = f(f(6)) = 18

继续这个”填空”过程:

xx123456789101112131415
f(x)f(x)236789121518192021222324

轨道分解#

观察上表,把每个 xx 和它的 f(x)f(x) 连起来看,会发现序列分成一条条”轨道”:

1236918271 \to 2 \to 3 \to 6 \to 9 \to 18 \to 27 \to \cdots 47122136634 \to 7 \to 12 \to 21 \to 36 \to 63 \to \cdots 58152445725 \to 8 \to 15 \to 24 \to 45 \to 72 \to \cdots

每条轨道的起点 ss 是不被 33 整除的数,然后交替进行两种操作:ff 和乘 33

sff(s)×33sff(3s)×39sfs \xrightarrow{f} f(s) \xrightarrow{\times 3} 3s \xrightarrow{f} f(3s) \xrightarrow{\times 3} 9s \xrightarrow{f} \cdots

这里用到一个关键性质:f(3kx)=3kf(x)f(3^k \cdot x) = 3^k \cdot f(x)。证明只需反复用 f(f(x))=3xf(f(x)) = 3x

f(3x)=f(f(f(x)))=3f(x)f(3x) = f(f(f(x))) = 3f(x)

归纳即得。

闭形式#

有了轨道分解,f(x)f(x) 的闭形式就清楚了。把 xx 写成 x=3ksx = 3^k \cdot s,其中 ss 不被 33 整除。那么 f(x)=3kf(s)f(x) = 3^k \cdot f(s),问题归结为求 f(s)f(s)

ss 所在轨道的结构是固定的:

sf(s)3s\dots \to s \to f(s) \to 3s \to \dots

在区间 [3k,3k+1)[3^k, 3^{k+1}) 内,轨道交替排列:前面的 ss 映射到 f(s)f(s)(落在同一区间内,偏移 +3k+3^k),后面的 ss 映射到 3s3s(跳到下一个区间)。

具体地,令 k=log3xk = \lfloor \log_3 x \rfloor

f(x)={x+3kif 3kx<23k3x3k+1if 23kx<3k+1f(x) = \begin{cases} x + 3^k & \text{if } 3^k \le x < 2 \cdot 3^k \\[6pt] 3x - 3^{k+1} & \text{if } 2 \cdot 3^k \le x < 3^{k+1} \end{cases}

验证:x=4x=4k=1k=1314<63^1 \le 4 < 6f(4)=4+3=7f(4)=4+3=7x=7x=7k=1k=167<96 \le 7 < 9f(7)=3×79=12f(7)=3 \times 7 - 9 = 12。和手算一致。

O(1)O(1) 算法#

先除掉 xx 中所有 33 的因子,用闭形式算出种子 ssf(s)f(s),再乘回 3k3^k

long long f(long long x) {
    if (x == 1) return 2;
    long long k = 0, s = x;
    while (s % 3 == 0) s /= 3, k++;
    long long fs;
    long long pk = 1;
    for (long long t = s; t >= 3; t /= 3) pk *= 3;
    if (s < 2 * pk)
        fs = s + pk;
    else
        fs = 3 * s - 3 * pk;
    while (k--) fs *= 3;
    return fs;
}
cpp

n1012n \le 10^{12} 都能秒出。

出题视角#

这个问题的核心壳子是:f(f(x))=kxf(f(x)) = kxff 严格单调。它可以衍生出不同难度:

签到级:直接按题目给出的少量数值模拟输出。

整数版(本题):金币为整数,需要推导出闭形式或写 O(n)O(n) 构造。推导轨道分解和分段线性闭形式是主要工作。

非整数版:如果金币可分割(ff 定义在实数上),f(f(x))=3xf(f(x)) = 3xff 严格递增的解是 f(x)=3xf(x) = \sqrt{3} \cdot x。不需要轨道分解,一次函数即可。

变体:改变复合次数或放大系数——f(m)(x)=kxf^{(m)}(x) = kx——会产生不同的轨道结构和分段模式。系数 kk 和复合次数 mm 决定了闭形式的复杂度。

逆函数:给定 kk,求 f(x)=kf(x) = k 的解 xx。从闭形式反解:

x={k3mif 3mk<23mk+3m+13if 23mk<3m+1x = \begin{cases} k - 3^m & \text{if } 3^m \le k < 2 \cdot 3^m \\[6pt] \frac{k + 3^{m+1}}{3} & \text{if } 2 \cdot 3^m \le k < 3^{m+1} \end{cases}

其中 m=log3km = \lfloor \log_3 k \rfloor

参考#

  • 原始灵感来自一道趣味数学题,核心条件是 f(f(x))=3xf(f(x)) = 3xff 严格递增。轨道分解的方法可以推广到一般 f(m)(x)=kxf^{(m)}(x) = kx 的情形。
出题症发作
https://fxj.wiki/blog/algorithm-question-design
Author 玛卡巴卡
Published at 2025年6月1日
Comment seems to stuck. Try to refresh?✨