Vibe Coding.

User

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
整数分拆等式

对于某些正整数k,存在形如4^t = 2^t + k的整数分拆,
其中4^t,2^t和k均为正整数,而t为实数。

前两个这样的分拆分别是4^1 = 2^1 + 2和4^{1.5849625…} = 2^{1.5849625…} + 6。

如果t也是整数,这样的分拆称为完美的。
对于任意m ≥ 1,记P(m)是所有k ≤ m的分拆中完美分拆的比例。
因此P(6) = 1/2。

下面的表格列出了P(m)的部分取值:

P(5) = 1/1
P(10) = 1/2
P(15) = 2/3
P(20) = 1/2
P(25) = 1/2
P(30) = 2/5

P(180) = 1/4
P(185) = 3/13

求出使得P(m) < 1/12345的最小m值。

上面这道题我的思路是:
首先注意到4^t==2^{2*t},所以设x=2^t,其中t是实数,那么
k=x^2-x
所以当x是整数的时候k一定是整数,反之不一定成立.
对于k<=m的限定,可以先用m=x^2-x求出两个x解,设正数解为x1,那么[2,\lfloor x1\rfloor]的部分全部都是分拆的可行解.
在这之中完美分拆的占比可以用2倍增去算,直到超过x1为止,这样比例就能算出来了.

对于上面确定的m,检查的时间复杂度是O(logn),瓶颈在于2的倍增.
我们套一个二分即可查出这个概率.

现在请你按照上面我的思路写一下python脚本.

GPT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
下面给出一个**直接按照你给的思路实现的 Python 脚本**,可直接运行求出最小的满足
**P(m) < 1/12345** 的 m。

思路复述(与你原来一致):

* 由
[
4^t = 2^t + k,\quad x = 2^t > 0
]

[
k = x^2 - x
]
* 对给定的 m,我们找到所有满足 (k \le m) 的 x,也就是求
[
x^2 - x - m = 0
\Rightarrow x = \frac{1 + \sqrt{1 + 4m}}2
]
的正根 (x_1)。
* 实数解的总数即为整数 x ∈ [2, ⌊x1⌋] 的个数:
real_count = max(0, ⌊x1⌋ − 1)
* 完美分拆要求 t 是整数 ⇔ x = 2^t 是 2 的幂。
在区间 [2, x1] 内统计 2 的幂数量即可。
* P(m) = perfect_count / real_count。
题目要找 P(m) < 1/12345 的最小 m。

使用二分搜索 m。

---

# ✅ Python 实现(按你给的思路)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import math

# 计算 P(m)
def P(m):
# 解方程 x^2 - x - m = 0 找正根
x1 = (1 + math.sqrt(1 + 4*m)) / 2
xmax = int(x1) # floor(x1)

if xmax < 2:
return 1 # 没分拆,视为比例 1,保证二分正确推进

real_count = xmax - 1 # x = 2,3,...,xmax

# 统计完美分拆(x 为 2^t)
perfect_count = 0
x = 2
while x <= xmax:
perfect_count += 1
x *= 2

return perfect_count / real_count


# 二分查找满足 P(m) < 1/12345 的最小 m
def find_min_m(threshold=1/12345):
# 搜索区间:m 至少到百万级才可能够,先指数扩展找到上界
lo = 1
hi = 1
while P(hi) >= threshold:
hi *= 2

# 二分查找
while lo < hi:
mid = (lo + hi) // 2
if P(mid) < threshold:
hi = mid
else:
lo = mid + 1
return lo


if __name__ == "__main__":
result = find_min_m()
print("最小满足 P(m) < 1/12345 的 m =", result)
1
2
3
4
5
6
7
8
9
10
11
12
13
---

# 📌 说明

* 复杂度几乎为 O(log m),因为

* 二分约需 log m 次
* 每次计算 P(m) 需要 O(log x)(只需倍增 2^t)
* 足以在几百毫秒内完成。

---

如果你想,我可以帮你运行这段代码验证最终的 m 值,或进一步优化性能。

Fact

一发过了,感觉写伪代码思路是对的.