Project Euler 183
Project Euler 183
题目
Maximum product of parts
Let $N$ be a positive integer and let $N$ be split into $k$ equal parts, $r = \dfrac{N}{k}$, so that $N = r + r + \dots + r$.
Let $P$ be the product of these parts, $P = r × r × \dots × r = r^k$.
For example, if $11$ is split into five equal parts, $11 = 2.2 + 2.2 + 2.2 + 2.2 + 2.2$, then $P = 2.2^5 = 51.53632$.
Let $M(N) = P_max$ for a given value of $N$.
It turns out that the maximum for $N = 11$ is found by splitting eleven into four equal parts which leads to $P_{\max} = (\dfrac{11}{4})^4$; that is, $M(11) = \dfrac{14641}{256} = 57.19140625$, which is a terminating decimal.
However, for $N = 8$ the maximum is achieved by splitting it into three equal parts, so $M(8) = \dfrac{512}{27}$, which is a non-terminating decimal.
Let $D(N) = N$ if $M(N)$ is a non-terminating decimal and $D(N) = -N$ if $M(N)$ is a terminating decimal.
For example, $\sum D(N)$ for $5 \le N \le 100$ is $2438$.
Find $\sum D(N)$ for $5 \le N \le 10000$.
解决方案
令函数$y(k)=\left(\dfrac{N}{k}\right)^k$,其中$k\in \mathbb{N^+}$。
由于函数$y(k)$的定义域是在整数域上,不好通过求导求最大值,因此将整数域扩展到实数域。
令$z(x)=\left(\dfrac{N}{x}\right)^x$,其中$x\in \mathbb{R}$。
对$z(x)$求导,计算得$z$的导数$z’(x)=\left(\dfrac{N}{x}\right)^x\cdot \left(\ln\dfrac{N}{x}-1\right)$。
令$z’(x)=0$,那么可以计算得到$x=\dfrac{N}{e}$,$z(x)$在$x_0=\dfrac{N}{e}$时将会取到最大值。
回到函数$y(k)$,那么如果$y$要取到最大值,那么最大值点$k$为$\left\lfloor\dfrac{N}{e}\right\rfloor,\left\lceil\dfrac{N}{e}\right\rceil$两个值之一。
因此,直接将它们代入函数$y(k)$代入,这种做法是可行的,不过由于$x_0=\dfrac{N}{e}$是在指数上出现的,因此直接代入计算,可能会导致结果失真。这里取而代之的方法是,代入$y(k)$的对数函数$\ln y(k)=k(\ln N-\ln k)$进行比较计算。
最终找到最大值点$k_0$后,开始解决最大值是否为有限小数的问题。
而这个问题比较简单,只需要判断分数$\dfrac{N}{k_0}$是否为有限小数即可。
代码
1 | from math import e, ceil, floor, log, gcd |