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
最大拆分乘积

N是一个正整数,将N拆分成k个相等的部分,记r = N/k,也即N = r + r + … + r。
记P是这些拆分的乘积,也即P = r × r × … × r = r^k。

例如,将11拆分成5个相等的部分,11 = 2.2 + 2.2 + 2.2 + 2.2 + 2.2,那么P = 2.2^5 = 51.53632。

对于给定的N,记M(N) = Pmax。

计算可得,N = 11时,这个最大值是在将其拆分成四等份时得到的,此时Pmax = (11/4)^4,也就是说M(11) = 14641/256 = 57.19140625,这是一个有限小数。

然而,对于N = 8,这个最大值是在将其拆分成三等份时得到的,此时M(8) = 512/27,不是有限小数。

若M(N)不是有限小数,记D(N) = N,反之记D(N) = -N。

例如,对于5 ≤ N ≤ 100,ΣD(N) 为2438。

对于5 ≤ N ≤ 10000,求ΣD(N)。

我的思路:直接暴力计算即可:枚举每个数字,然后枚举每个拆分的大小,确定哪个拆分最大后把分数表示出来判断是不是有限小数即可.

注意:1. 你可以使用log存储数字和判断最大值.
2. 先对分母分子求gcd,然后分母除掉gcd剩下的部分不能含有2和5以外的因子,否则是无限小数.

请给我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 代码,核心点包括:

* 用 `log` 比较不同拆分数 `k` 下的乘积大小,避免大数溢出
* 找到使 ( P = (N/k)^k ) 最大的整数 `k`
* 将 ( (N/k)^k ) 视为分数 ( \frac{N^k}{k^k} ),用 `gcd` 约分
* 判断约分后分母是否只含有质因子 `2` 和 `5`
* 根据是否有限小数决定 `D(N)` 的符号并累加

---

### 数学说明(简要)

* 连续情况下最大值在 ( k = N/e ) 附近
* 这里只允许 **整数 k**,所以枚举即可
*

[
\frac{N^k}{k^k}
\quad\Rightarrow\quad
\gcd(N^k, k^k) = \gcd(N, k)^k
]

* 约分后分母为
[
\left(\frac{k}{\gcd(N,k)}\right)^k
]
* 分母只含 `2,5` ⇒ **有限小数**

---

### 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
45
46
47
48
49
50
51
52
import math
from math import gcd, log

def is_finite_decimal(N, k):
"""
判断 (N/k)^k 是否是有限小数
"""
g = gcd(N, k)
denom = k // g # 约分后的分母底数

# 去掉 2 和 5
while denom % 2 == 0:
denom //= 2
while denom % 5 == 0:
denom //= 5

return denom == 1


def best_k(N):
"""
找到使 (N/k)^k 最大的整数 k
使用 log 比较
"""
best_val = -1e100
best_k = 1

for k in range(1, N + 1):
val = k * (log(N) - log(k)) # log((N/k)^k)
if val > best_val:
best_val = val
best_k = k

return best_k


def compute_sum_D(limit=10000):
total = 0

for N in range(5, limit + 1):
k = best_k(N)

if is_finite_decimal(N, k):
total -= N
else:
total += N

return total


if __name__ == "__main__":
print(compute_sum_D(10000))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
---

### 复杂度与说明

* 时间复杂度:
[
O\left(\sum_{N=5}^{10000} N\right) \approx 5 \times 10^7
]
在 Python 中 **可接受(几秒内)**

* 若你想进一步优化:

* `k` 只需枚举 `max(1, int(N/e)-5)` 到 `int(N/e)+5`
* 因为最大值一定在 `N/e` 附近

---

如果你愿意,我可以帮你写一个 **优化版(只枚举 ~10 个 k)** 或者改成 **C++ 高性能版本**。

fun fact

我认为分数会爆i128,所以让gpt写py了

一发过,应该是没问题的.