For each integer \(n\ge 5\), we split \(n\) into \(k\) equal real parts, so each part is \(n/k\), and we consider the product
$$M(n,k)=\left(\frac{n}{k}\right)^k.$$
Among all positive integers \(k\), we choose the value that maximizes this expression and call the resulting maximum \(M(n)\). The function \(D(n)\) is then defined by the decimal expansion of \(M(n)\): if \(M(n)\) is a terminating decimal, we take \(D(n)=-n\); otherwise we take \(D(n)=+n\).
The task is to evaluate \(D(n)\) for every \(n\) from 5 through 10000 and add the results. The challenge is not large-number arithmetic; it is identifying the maximizing \(k\) and deciding the terminating-decimal condition without ever expanding huge powers explicitly.
The whole solution rests on two independent facts. First, the maximizing number of equal parts is always extremely close to \(n/e\). Second, after we reduce \(n/k\) to lowest terms, only the prime factors of its denominator matter for decimal termination.
For fixed \(n\), define
$$f_n(k)=\left(\frac{n}{k}\right)^k.$$
Comparing such values directly is inconvenient, so we take logarithms and study
$$\phi_n(x)=\log f_n(x)=x(\log n-\log x)$$
for real \(x>0\). Differentiating gives
$$\phi_n'(x)=\log\!\left(\frac{n}{x}\right)-1,\qquad \phi_n''(x)=-\frac{1}{x} \lt 0.$$
Because the second derivative is always negative, \(\phi_n\) is strictly concave, so it has a unique real maximum. Setting \(\phi_n'(x)=0\) yields
$$x=\frac{n}{e}.$$
Therefore the maximizing integer \(k\) must be one of the integers nearest to \(n/e\). In practice this means either rounding \(n/e\) to the nearest integer, or comparing the two neighbors \(\left\lfloor n/e\right\rfloor\) and \(\left\lfloor n/e\right\rfloor+1\) with logarithms.
Let \(k_n\) be the maximizing integer for \(n\). Reduce the fraction \(n/k_n\) to lowest terms:
$$\frac{n}{k_n}=\frac{a}{q},\qquad \gcd(a,q)=1.$$
Then
$$M(n)=\left(\frac{n}{k_n}\right)^{k_n}=\left(\frac{a}{q}\right)^{k_n}=\frac{a^{k_n}}{q^{k_n}}.$$
Since \(\gcd(a,q)=1\), we also have \(\gcd(a^{k_n},q^{k_n})=1\), so this fraction is already reduced. That means the reduced denominator of \(M(n)\) is exactly \(q^{k_n}\).
A rational number has a terminating decimal expansion if and only if its reduced denominator has no prime factors other than 2 and 5. Therefore \(M(n)\) terminates exactly when \(q\) itself has the form
$$q=2^\alpha 5^\beta$$
for some integers \(\alpha,\beta\ge 0\). This is why the implementations only compute
$$q=\frac{k_n}{\gcd(n,k_n)}$$
and then repeatedly divide out factors of 2 and 5.
Take \(n=11\). Since \(11/e\approx 4.046\), the only serious integer candidates are \(k=4\) and \(k=5\). Their products are
$$\left(\frac{11}{4}\right)^4=57.19140625,\qquad \left(\frac{11}{5}\right)^5=51.53632,$$
so the maximum occurs at \(k_{11}=4\). The reduced fraction is \(11/4\), hence \(q=4=2^2\). Therefore
$$M(11)=\left(\frac{11}{4}\right)^4=\frac{14641}{256}$$
has a terminating decimal expansion, and \(D(11)=-11\).
For contrast, take \(n=8\). Here \(8/e\approx 2.943\), so the maximizing integer is \(k_8=3\). Then
$$\frac{8}{3}$$
is already reduced, so \(q=3\). Because 3 is neither 2 nor 5, the denominator of \(M(8)=(8/3)^3=512/27\) contains a forbidden prime factor, so the decimal expansion does not terminate and \(D(8)=+8\).
Once the sign rule is understood, the rest of the problem is completely separable by \(n\). For each integer \(n\in[5,10000]\), we find the maximizing \(k_n\), form \(q=k_n/\gcd(n,k_n)\), test whether \(q\) contains primes other than 2 and 5, and contribute either \(-n\) or \(+n\). Symbolically,
$$\sum_{n=5}^{10000} D(n)$$
is computed as a simple loop with no interaction between different values of \(n\).
The C++, Python, and Java implementations all follow the same mathematical pipeline, with a small difference in how they choose the optimal number of parts. The C++ implementation computes the two neighboring integers around \(n/e\) and compares their logarithmic scores \(k(\log n-\log k)\), which avoids constructing the power itself. The Python and Java implementations take the nearest integer to \(n/e\), which matches the same concavity argument.
After choosing that maximizing integer, the implementation reduces the fraction \(n/k\) indirectly by computing \(k/\gcd(n,k)\). This is the reduced denominator \(q\). It then removes every factor of 2 and every factor of 5 from \(q\). If nothing remains, the maximal product has a terminating decimal expansion, so the running total is decreased by \(n\). Otherwise the running total is increased by \(n\).
No big-integer exponentiation is needed anywhere. The code never forms \(M(n)\) itself, because the logarithmic comparison is enough to find the maximizing \(k\), and the denominator criterion is enough to decide the sign of \(D(n)\).
Each value of \(n\) is processed independently. The work consists of one constant-size floating-point optimization step, one greatest-common-divisor computation, and a short loop that strips factors of 2 and 5 from the reduced denominator. The gcd step costs \(O(\log n)\), and the factor stripping is also \(O(\log n)\) in the worst case.
If the upper limit is \(U\), the total running time is \(O(U\log U)\); for the specific range \(5\le n\le 10000\), this is effectively a linear scan with very small constant factors. The auxiliary memory usage is \(O(1)\).
Für jede ganze Zahl \(n\ge 5\) wird \(n\) in \(k\) gleich große reelle Teile zerlegt; jeder Teil hat also den Wert \(n/k\). Dazu gehört das Produkt
$$M(n,k)=\left(\frac{n}{k}\right)^k.$$
Unter allen positiven ganzen Zahlen \(k\) wählen wir den Wert, der dieses Produkt maximiert, und nennen das Ergebnis \(M(n)\). Danach wird \(D(n)\) über die Dezimaldarstellung von \(M(n)\) definiert: endet sie, so ist \(D(n)=-n\); andernfalls ist \(D(n)=+n\).
Gesucht ist die Summe von \(D(n)\) für alle \(n\) von 5 bis 10000. Der eigentliche Kern des Problems besteht darin, das optimale \(k\) schnell zu finden und die Endlichkeit der Dezimaldarstellung zu entscheiden, ohne die Potenz \(\left(n/k\right)^k\) direkt auszurechnen.
Die Lösung zerfällt in zwei saubere Teile. Zuerst bestimmt man, bei welchem \(k\) das Produkt maximal ist. Danach prüft man nur noch die Primfaktoren des gekürzten Nenners von \(n/k\).
Für festes \(n\) setzen wir
$$f_n(k)=\left(\frac{n}{k}\right)^k.$$
Zum Vergleichen ist die Logarithmenform bequemer:
$$\phi_n(x)=\log f_n(x)=x(\log n-\log x)$$
für reelle \(x>0\). Ableiten liefert
$$\phi_n'(x)=\log\!\left(\frac{n}{x}\right)-1,\qquad \phi_n''(x)=-\frac{1}{x}\lt 0.$$
Die zweite Ableitung ist stets negativ, also ist \(\phi_n\) streng konkav und besitzt genau ein reelles Maximum. Aus \(\phi_n'(x)=0\) folgt sofort
$$x=\frac{n}{e}.$$
Der optimale ganzzahlige Wert muss deshalb direkt bei \(n/e\) liegen. Man braucht also nur den nächstgelegenen ganzzahligen Kandidaten oder, numerisch besonders robust, die beiden Nachbarn \(\lfloor n/e\rfloor\) und \(\lfloor n/e\rfloor+1\).
Sei \(k_n\) das maximale \(k\) für dieses \(n\). Kürze die Bruchzahl \(n/k_n\) vollständig:
$$\frac{n}{k_n}=\frac{a}{q},\qquad \gcd(a,q)=1.$$
Dann gilt
$$M(n)=\left(\frac{n}{k_n}\right)^{k_n}=\left(\frac{a}{q}\right)^{k_n}=\frac{a^{k_n}}{q^{k_n}}.$$
Wegen \(\gcd(a,q)=1\) ist auch \(\gcd(a^{k_n},q^{k_n})=1\). Der Bruch ist also bereits vollständig gekürzt, und sein Nenner ist genau \(q^{k_n}\).
Eine rationale Zahl besitzt genau dann eine endliche Dezimaldarstellung, wenn ihr gekürzter Nenner nur die Primfaktoren 2 und 5 enthält. Deshalb ist \(M(n)\) genau dann endlich, wenn \(q\) die Form
$$q=2^\alpha 5^\beta$$
hat. Genau daraus entsteht der einfache Test
$$q=\frac{k_n}{\gcd(n,k_n)}$$
mit anschließendem Entfernen aller Faktoren 2 und 5.
Betrachte zuerst \(n=11\). Da \(11/e\approx 4{,}046\), reichen die Kandidaten \(k=4\) und \(k=5\). Es gilt
$$\left(\frac{11}{4}\right)^4=57.19140625,\qquad \left(\frac{11}{5}\right)^5=51.53632,$$
also ist \(k_{11}=4\) optimal. Der Bruch \(11/4\) ist bereits gekürzt, also \(q=4=2^2\). Damit ist
$$M(11)=\left(\frac{11}{4}\right)^4=\frac{14641}{256}$$
eine endliche Dezimalzahl und folglich \(D(11)=-11\).
Zum Vergleich \(n=8\): Hier liegt das Maximum bei \(k_8=3\). Die reduzierte Bruchzahl ist \(8/3\), also \(q=3\). Dann enthält der Nenner von \(M(8)=512/27\) einen anderen Primfaktor als 2 oder 5, die Dezimaldarstellung ist nicht endlich, und daher \(D(8)=+8\).
Nachdem das Vorzeichenkriterium feststeht, ist der Rest rein lokal. Für jedes \(n\in[5,10000]\) wird das optimale \(k_n\) bestimmt, anschließend \(q=k_n/\gcd(n,k_n)\) gebildet und auf Primfaktoren außerhalb von 2 und 5 geprüft. Je nach Ergebnis trägt dieses \(n\) entweder \(-n\) oder \(+n\) zur Gesamtsumme
$$\sum_{n=5}^{10000} D(n)$$
bei. Zwischen verschiedenen Werten von \(n\) gibt es keine Abhängigkeiten.
Die C++-, Python- und Java-Implementierungen verwenden alle dieselbe mathematische Idee. Zuerst wird für jedes \(n\) das optimale \(k\) nahe bei \(n/e\) bestimmt. Die C++-Implementierung vergleicht dazu die beiden Nachbarwerte über die logarithmische Zielfunktion \(k(\log n-\log k)\). Die Python- und Java-Implementierungen nehmen direkt die nächstliegende ganze Zahl zu \(n/e\), was durch die Konkavität derselben Funktion motiviert ist.
Danach bildet die Implementierung den gekürzten Nenner indirekt als \(k/\gcd(n,k)\). Von diesem Wert werden alle Zweier- und Fünferpotenzen entfernt. Bleibt am Ende 1 übrig, dann terminiert die Dezimaldarstellung von \(M(n)\) und die laufende Summe wird um \(n\) verringert. Andernfalls wird \(n\) addiert.
Wichtig ist, dass nirgendwo die große Potenz selbst berechnet werden muss. Weder für die Maximalsuche noch für die Dezimalprüfung ist eine direkte Auswertung von \(M(n)\) nötig.
Jeder Wert \(n\) wird unabhängig verarbeitet. Pro Schritt fallen eine konstante Anzahl von Fließkommaoperationen, eine ggT-Berechnung und ein kurzes Entfernen von Faktoren 2 und 5 an. Die ggT-Berechnung kostet \(O(\log n)\), und auch das Faktorreduzieren ist im Worst Case \(O(\log n)\).
Bei einer oberen Grenze \(U\) ergibt sich insgesamt \(O(U\log U)\) Laufzeit. Für den konkreten Bereich bis 10000 ist das praktisch ein sehr schneller linearer Durchlauf. Der zusätzliche Speicherbedarf bleibt \(O(1)\).
Her \(n\ge 5\) tamsayısı için \(n\), \(k\) tane eşit gerçek parçaya ayrılır; her parçanın büyüklüğü \(n/k\) olur. Buna karşılık gelen çarpım
$$M(n,k)=\left(\frac{n}{k}\right)^k$$
şeklindedir. Pozitif tamsayı \(k\) değerleri arasında bu ifadeyi en büyük yapan seçilir ve ortaya çıkan en büyük değer \(M(n)\) diye adlandırılır.
Daha sonra \(D(n)\), \(M(n)\)'in ondalık açılımına göre tanımlanır: \(M(n)\) sonlu ondalıksa \(D(n)=-n\), değilse \(D(n)=+n\). Amaç, \(5\) ile \(10000\) arasındaki bütün \(n\) değerleri için \(D(n)\)'leri toplayabilmektir. Asıl mesele büyük üsleri hesaplamak değil; doğru \(k\)'yı ve sonlu ondalık koşulunu akıllıca bulmaktır.
Çözüm iki ana gözleme dayanır. Birincisi, maksimum ürünü veren parça sayısı her zaman \(n/e\) civarındadır. İkincisi, \(n/k\) sadeleştirildikten sonra sonlu ondalık olup olmayacağını belirleyen tek şey payda tarafındaki asal çarpanlardır.
Sabit bir \(n\) için
$$f_n(k)=\left(\frac{n}{k}\right)^k$$
tanımını yapalım. Bu ifadeleri doğrudan karşılaştırmak yerine logaritma almak daha temizdir:
$$\phi_n(x)=\log f_n(x)=x(\log n-\log x)$$
\(x>0\) için türevler
$$\phi_n'(x)=\log\!\left(\frac{n}{x}\right)-1,\qquad \phi_n''(x)=-\frac{1}{x}\lt 0$$
olur. İkinci türevin hep negatif olması, \(\phi_n\)'nin sıkı konkav olduğunu gösterir; dolayısıyla tek bir gerçek maksimum vardır. \(\phi_n'(x)=0\) denklemi ise bu maksimumun
$$x=\frac{n}{e}$$
noktasında olduğunu söyler. Bu yüzden en iyi tamsayı \(k\), mutlaka \(n/e\)'ye en yakın tam sayılardan biridir. Pratikte ya doğrudan yuvarlama yapılır ya da \(\lfloor n/e\rfloor\) ile \(\lfloor n/e\rfloor+1\) logaritmik skorla karşılaştırılır.
\(n\) için maksimumu veren tamsayıyı \(k_n\) ile gösterelim. Önce \(n/k_n\) kesrini sadeleştirelim:
$$\frac{n}{k_n}=\frac{a}{q},\qquad \gcd(a,q)=1.$$
O zaman
$$M(n)=\left(\frac{n}{k_n}\right)^{k_n}=\left(\frac{a}{q}\right)^{k_n}=\frac{a^{k_n}}{q^{k_n}}.$$
\(\gcd(a,q)=1\) olduğundan \(\gcd(a^{k_n},q^{k_n})=1\) de geçerlidir. Yani bu ifade zaten sadesidir ve \(M(n)\)'in indirgenmiş paydası tam olarak \(q^{k_n}\) olur.
Bir rasyonel sayı ancak ve ancak indirgenmiş paydası yalnızca 2 ve 5 asal çarpanlarından oluşuyorsa sonlu ondalık verir. Demek ki \(M(n)\)'in sonlu olması için \(q\)'nun
$$q=2^\alpha 5^\beta$$
biçiminde olması yeter ve gereklidir. Uygulamalardaki temel test tam olarak budur:
$$q=\frac{k_n}{\gcd(n,k_n)}.$$
Daha sonra \(q\)'dan bütün 2 ve 5 çarpanları sıyrılır; kalan 1 ise sonlu, değilse sonsuz tekrar eden ondalık vardır.
\(n=11\) için \(11/e\approx 4.046\) olduğundan yalnızca \(k=4\) ve \(k=5\) ciddi adaydır. Bunların ürünleri
$$\left(\frac{11}{4}\right)^4=57.19140625,\qquad \left(\frac{11}{5}\right)^5=51.53632$$
olduğu için maksimum \(k_{11}=4\) ile gelir. Kesir zaten sade olduğundan \(q=4=2^2\). Böylece
$$M(11)=\left(\frac{11}{4}\right)^4=\frac{14641}{256}$$
sonlu ondalıktır ve \(D(11)=-11\).
Buna karşılık \(n=8\) için maksimum \(k_8=3\) olur. Bu kez \(8/3\) sade biçimdedir ve \(q=3\). 3, izin verilen asal çarpanlardan biri olmadığı için \(M(8)=512/27\) sonlu ondalık değildir; dolayısıyla \(D(8)=+8\).
İşaret kuralı kurulduktan sonra problem tümüyle ayrışır. Her \(n\in[5,10000]\) için aynı üç adım uygulanır: maksimumu veren \(k_n\) bulunur, \(q=k_n/\gcd(n,k_n)\) hesaplanır, sonra \(q\)'nun sadece 2 ve 5 içerip içermediği test edilir. Sonuçta toplam
$$\sum_{n=5}^{10000} D(n)$$
bağımsız katkıların tek bir döngü içinde toplanmasıyla elde edilir.
C++, Python ve Java uygulamaları aynı matematiksel omurgayı izler. Önce her \(n\) için en uygun parça sayısı seçilir. C++ uygulaması \(n/e\)'nin iki komşu tamsayısını logaritmik hedef fonksiyonla karşılaştırır; böylece üssü gerçekten hesaplamadan hangisinin daha iyi olduğunu bulur. Python ve Java uygulamalarıysa \(n/e\)'ye en yakın tamsayıyı alır; bu seçim de aynı konkavlık argümanına dayanır.
Ardından uygulama, \(n/k\) kesrinin sadeleştirilmiş paydasını dolaylı biçimde \(k/\gcd(n,k)\) olarak bulur. Bu değerden tüm 2 ve 5 çarpanları temizlenir. Sonunda 1 kalıyorsa o \(n\) için katkı \(-n\), aksi halde \(+n\) olur.
Dikkat edilmesi gereken önemli nokta şudur: implementasyon hiçbir yerde \(\left(n/k\right)^k\) ifadesini tam olarak kurmaz. Maksimumu belirlemek için logaritmalar, işareti belirlemek için ise sade payda testi yeterlidir.
Her \(n\) bağımsız işlendiği için maliyet çok düşüktür. Bir sabit boyutlu optimizasyon adımı, bir \(\gcd\) hesabı ve 2 ile 5 çarpanlarını temizleyen kısa bir döngü vardır. \(\gcd\) hesabı \(O(\log n)\), çarpan sıyırma da en kötü durumda \(O(\log n)\) zaman alır.
Üst sınır \(U\) ise toplam süre \(O(U\log U)\) olur. Bu problemde \(U=10000\) olduğundan pratikte çok hafif bir tarama yapılır. Ek bellek kullanımı \(O(1)\)'dir.
Para cada entero \(n\ge 5\), se divide \(n\) en \(k\) partes reales iguales; cada parte vale \(n/k\). El producto asociado es
$$M(n,k)=\left(\frac{n}{k}\right)^k.$$
Entre todos los enteros positivos \(k\), se elige el que maximiza esa expresión, y al valor máximo resultante se le llama \(M(n)\). Después se define \(D(n)\) según la expansión decimal de \(M(n)\): si \(M(n)\) es un decimal finito, entonces \(D(n)=-n\); en caso contrario, \(D(n)=+n\).
La tarea consiste en sumar \(D(n)\) para todos los \(n\) entre 5 y 10000. El objetivo no es calcular potencias gigantes, sino encontrar el \(k\) óptimo y decidir la condición de decimal finito mediante una caracterización mucho más simple.
La solución se apoya en dos observaciones concretas. La primera dice que el máximo de \(\left(n/k\right)^k\) aparece muy cerca de \(n/e\). La segunda dice que, una vez reducida la fracción \(n/k\), solo importan los factores primos de su denominador.
Para un \(n\) fijo definimos
$$f_n(k)=\left(\frac{n}{k}\right)^k.$$
Es más cómodo comparar sus logaritmos:
$$\phi_n(x)=\log f_n(x)=x(\log n-\log x)$$
para \(x>0\). Sus derivadas son
$$\phi_n'(x)=\log\!\left(\frac{n}{x}\right)-1,\qquad \phi_n''(x)=-\frac{1}{x}\lt 0.$$
Como la segunda derivada siempre es negativa, \(\phi_n\) es estrictamente cóncava y tiene un único máximo real. Resolver \(\phi_n'(x)=0\) da
$$x=\frac{n}{e}.$$
Por tanto, el mejor entero \(k\) debe ser uno de los enteros más cercanos a \(n/e\). En la práctica basta con redondear \(n/e\) o comparar explícitamente \(\lfloor n/e\rfloor\) y \(\lfloor n/e\rfloor+1\).
Sea \(k_n\) el entero que maximiza la expresión para ese \(n\). Reducimos la fracción \(n/k_n\):
$$\frac{n}{k_n}=\frac{a}{q},\qquad \gcd(a,q)=1.$$
Entonces
$$M(n)=\left(\frac{n}{k_n}\right)^{k_n}=\left(\frac{a}{q}\right)^{k_n}=\frac{a^{k_n}}{q^{k_n}}.$$
Como \(a\) y \(q\) son coprimos, también lo son \(a^{k_n}\) y \(q^{k_n}\). Eso significa que la fracción ya está reducida y que el denominador reducido de \(M(n)\) es exactamente \(q^{k_n}\).
Un número racional tiene expansión decimal finita si y solo si su denominador reducido solo contiene los primos 2 y 5. Así, \(M(n)\) termina exactamente cuando \(q\) tiene la forma
$$q=2^\alpha 5^\beta.$$
De ahí sale el criterio utilizado por la implementación:
$$q=\frac{k_n}{\gcd(n,k_n)}$$
y luego eliminar todos los factores 2 y 5.
Para \(n=11\), se tiene \(11/e\approx 4.046\), así que los candidatos relevantes son \(k=4\) y \(k=5\). Sus valores son
$$\left(\frac{11}{4}\right)^4=57.19140625,\qquad \left(\frac{11}{5}\right)^5=51.53632,$$
por lo que el máximo aparece en \(k_{11}=4\). La fracción \(11/4\) ya está reducida, de modo que \(q=4=2^2\). En consecuencia,
$$M(11)=\left(\frac{11}{4}\right)^4=\frac{14641}{256}$$
tiene decimal finito y \(D(11)=-11\).
En cambio, para \(n=8\), el máximo está en \(k_8=3\). Entonces \(8/3\) es irreducible y \(q=3\). Como el primo 3 no está permitido en un decimal finito, \(M(8)=512/27\) no termina y por eso \(D(8)=+8\).
Una vez entendido el criterio de signo, todo el problema se separa por valores de \(n\). Para cada \(n\in[5,10000]\) se calcula el \(k_n\) óptimo, luego \(q=k_n/\gcd(n,k_n)\), y finalmente se decide si \(q\) contiene factores distintos de 2 y 5. Así se acumula la suma
$$\sum_{n=5}^{10000} D(n)$$
sin ninguna dependencia entre distintos términos.
Las implementaciones en C++, Python y Java siguen exactamente esa derivación. Primero determinan el número óptimo de partes. La versión en C++ compara los dos vecinos alrededor de \(n/e\) mediante la puntuación logarítmica \(k(\log n-\log k)\), mientras que las versiones en Python y Java toman el entero más cercano a \(n/e\).
Después calculan el denominador reducido de \(n/k\) como \(k/\gcd(n,k)\). A ese valor le eliminan todos los factores 2 y 5. Si el residuo final es 1, la expansión decimal del producto máximo es finita y se añade \(-n\) al total; si no, se añade \(+n\).
La implementación nunca necesita construir la potencia máxima de forma explícita. Los logaritmos resuelven la optimización, y el criterio del denominador reducido resuelve la parte aritmética.
Cada entero \(n\) se procesa de manera independiente. El costo por término consiste en una pequeña comparación numérica, un cálculo de mcd y un bucle corto que divide por 2 y por 5 mientras sea posible. El mcd cuesta \(O(\log n)\), y el mismo orden vale para la limpieza de factores en el peor caso.
Si el límite superior es \(U\), el tiempo total es \(O(U\log U)\). En el intervalo concreto de este problema, eso equivale a una pasada muy ligera. El uso de memoria auxiliar es \(O(1)\).
对每个整数 \(n\ge 5\),把 \(n\) 分成 \(k\) 个相等的实数部分,每一部分都是 \(n/k\)。对应的乘积写成
$$M(n,k)=\left(\frac{n}{k}\right)^k.$$
在所有正整数 \(k\) 中,选出使该表达式最大的那个值,于是得到最大值 \(M(n)\)。随后根据 \(M(n)\) 的十进制表示来定义 \(D(n)\):如果 \(M(n)\) 是有限小数,就取 \(D(n)=-n\);如果不是有限小数,就取 \(D(n)=+n\)。
题目要求把 \(5\le n\le 10000\) 的所有 \(D(n)\) 相加。难点不在于直接算出巨大的幂,而在于用更精炼的数学结构判断最优的 \(k\) 以及小数是否终止。
这个问题的解法可以分成两个完全贴合题意的部分。第一部分说明最大乘积为什么出现在 \(n/e\) 附近。第二部分说明为什么只要检查约分后分母中的质因数,就能判断 \(M(n)\) 是否是有限小数。
对固定的 \(n\),定义
$$f_n(k)=\left(\frac{n}{k}\right)^k.$$
直接比较这些幂不方便,因此改看它的对数:
$$\phi_n(x)=\log f_n(x)=x(\log n-\log x),\qquad x>0.$$
对实变量求导,得到
$$\phi_n'(x)=\log\!\left(\frac{n}{x}\right)-1,\qquad \phi_n''(x)=-\frac{1}{x}\lt 0.$$
因为二阶导数始终为负,所以 \(\phi_n\) 是严格凹函数,实数范围内只有一个极大点。令一阶导数为零,就得到
$$x=\frac{n}{e}.$$
这说明最优的整数 \(k\) 一定落在 \(n/e\) 附近,只可能是距离它最近的整数。实际实现时,要么直接把 \(n/e\) 四舍五入到最近整数,要么显式比较 \(\lfloor n/e\rfloor\) 与 \(\lfloor n/e\rfloor+1\) 的对数得分。
设使乘积最大的整数为 \(k_n\)。把 \(n/k_n\) 约成最简分数:
$$\frac{n}{k_n}=\frac{a}{q},\qquad \gcd(a,q)=1.$$
于是
$$M(n)=\left(\frac{n}{k_n}\right)^{k_n}=\left(\frac{a}{q}\right)^{k_n}=\frac{a^{k_n}}{q^{k_n}}.$$
由于 \(a\) 与 \(q\) 互素,所以 \(a^{k_n}\) 与 \(q^{k_n}\) 仍然互素,这说明上式已经是最简形式。也就是说,\(M(n)\) 的最简分母恰好就是 \(q^{k_n}\)。
一个有理数的十进制表示是有限小数,当且仅当它的最简分母只含质因数 2 和 5。因此,\(M(n)\) 是否终止完全取决于 \(q\) 是否可以写成
$$q=2^\alpha 5^\beta.$$
这正是实现里真正使用的对象:
$$q=\frac{k_n}{\gcd(n,k_n)}.$$
随后不断把 2 和 5 从 \(q\) 中除掉;若最后剩下 1,则小数终止,否则不会终止。
先看 \(n=11\)。因为 \(11/e\approx 4.046\),所以只需比较 \(k=4\) 和 \(k=5\):
$$\left(\frac{11}{4}\right)^4=57.19140625,\qquad \left(\frac{11}{5}\right)^5=51.53632.$$
因此最大值出现在 \(k_{11}=4\)。这时 \(11/4\) 已经最简,所以 \(q=4=2^2\)。于是
$$M(11)=\left(\frac{11}{4}\right)^4=\frac{14641}{256}$$
是有限小数,因此 \(D(11)=-11\)。
再看 \(n=8\)。最优整数是 \(k_8=3\),而 \(8/3\) 已经最简,所以 \(q=3\)。由于 3 不是 2 或 5,\(M(8)=512/27\) 的十进制表示不会终止,因此 \(D(8)=+8\)。这两个例子正好对应题目中的两种符号情况。
一旦符号判定规则明确,整个求和过程就是对每个 \(n\) 做同样的独立处理。对 \(n\in[5,10000]\),先求出最优的 \(k_n\),再计算
$$q=\frac{k_n}{\gcd(n,k_n)},$$
检查 \(q\) 除去所有 2 和 5 之后是否变成 1。于是总和
$$\sum_{n=5}^{10000} D(n)$$
只是一个没有相互依赖的顺序累加。
C++、Python 和 Java 实现采用完全相同的数学流程,只是在选取最优 \(k\) 的细节上略有不同。C++ 实现先取 \(n/e\) 两侧最接近的两个整数,用对数目标函数 \(k(\log n-\log k)\) 比较谁更优;Python 和 Java 实现则直接取 \(n/e\) 的最近整数,这与前面的严格凹性分析是一致的。
选定最优 \(k\) 之后,实现不会去构造 \(\left(n/k\right)^k\) 本身,而是计算 \(k/\gcd(n,k)\),这就是约分后分母 \(q\)。随后不断除去 2 和 5。如果最终结果是 1,说明最大乘积是有限小数,于是把 \(-n\) 加入总和;否则加入 \(+n\)。
这种写法的关键优点是把“最大幂”和“十进制终止”两个看似昂贵的问题,都转化成了常数级的对数比较与简单的整数算术。
每个 \(n\) 的处理彼此独立。单次处理包含一次很小的浮点优化、一次最大公因数计算,以及一个把 2 和 5 从分母中剥离的短循环。最大公因数计算是 \(O(\log n)\),剥离因子的过程在最坏情况下也是 \(O(\log n)\)。
如果上界记为 \(U\),总时间复杂度就是 \(O(U\log U)\)。在本题的具体范围内,这几乎就是一次非常轻量的线性扫描。额外空间复杂度为 \(O(1)\)。
Для каждого целого числа \(n\ge 5\) число \(n\) разбивается на \(k\) равных вещественных частей, то есть каждая часть равна \(n/k\). Рассматривается произведение
$$M(n,k)=\left(\frac{n}{k}\right)^k.$$
Среди всех положительных целых \(k\) выбирается то, при котором это выражение максимально; полученное максимальное значение обозначим через \(M(n)\). Затем определяется \(D(n)\): если \(M(n)\) имеет конечную десятичную запись, то \(D(n)=-n\), а если запись бесконечна, то \(D(n)=+n\).
Нужно просуммировать \(D(n)\) для всех \(n\) от 5 до 10000. Главное здесь не вычислять огромные степени напрямую, а понять, какое \(k\) оптимально и почему признак конечной десятичной дроби сводится к очень простой проверке знаменателя.
Вся идея решения держится на двух фактах. Во-первых, оптимальное число частей всегда находится около \(n/e\). Во-вторых, после сокращения дроби \(n/k\) судьбу десятичной записи определяют только простые множители знаменателя.
Для фиксированного \(n\) введем функцию
$$f_n(k)=\left(\frac{n}{k}\right)^k.$$
Удобнее работать не с ней самой, а с ее логарифмом:
$$\phi_n(x)=\log f_n(x)=x(\log n-\log x),\qquad x>0.$$
Тогда
$$\phi_n'(x)=\log\!\left(\frac{n}{x}\right)-1,\qquad \phi_n''(x)=-\frac{1}{x}\lt 0.$$
Поскольку вторая производная всегда отрицательна, функция строго вогнута и имеет единственную точку максимума на положительной вещественной оси. Из уравнения \(\phi_n'(x)=0\) получаем
$$x=\frac{n}{e}.$$
Следовательно, лучший целый кандидат обязан лежать среди ближайших целых к \(n/e\). Поэтому достаточно либо округлить \(n/e\) до ближайшего целого, либо явно сравнить два соседних значения \(\lfloor n/e\rfloor\) и \(\lfloor n/e\rfloor+1\).
Пусть \(k_n\) обозначает оптимальное целое значение. Сократим дробь \(n/k_n\):
$$\frac{n}{k_n}=\frac{a}{q},\qquad \gcd(a,q)=1.$$
Тогда
$$M(n)=\left(\frac{n}{k_n}\right)^{k_n}=\left(\frac{a}{q}\right)^{k_n}=\frac{a^{k_n}}{q^{k_n}}.$$
Так как \(a\) и \(q\) взаимно просты, взаимно просты и \(a^{k_n}\), \(q^{k_n}\). Значит, эта дробь уже записана в несократимом виде, а ее знаменатель равен \(q^{k_n}\).
Рациональное число имеет конечную десятичную запись тогда и только тогда, когда в его сокращенном знаменателе нет простых множителей, кроме 2 и 5. Значит, \(M(n)\) конечно тогда и только тогда, когда
$$q=2^\alpha 5^\beta.$$
Именно поэтому реализация вычисляет лишь
$$q=\frac{k_n}{\gcd(n,k_n)}$$
и затем удаляет из \(q\) все множители 2 и 5.
Возьмем \(n=11\). Поскольку \(11/e\approx 4.046\), достаточно сравнить \(k=4\) и \(k=5\):
$$\left(\frac{11}{4}\right)^4=57.19140625,\qquad \left(\frac{11}{5}\right)^5=51.53632.$$
Максимум достигается при \(k_{11}=4\). Дробь \(11/4\) уже сокращена, значит \(q=4=2^2\). Следовательно,
$$M(11)=\left(\frac{11}{4}\right)^4=\frac{14641}{256}$$
имеет конечную десятичную запись, и потому \(D(11)=-11\).
Для \(n=8\) оптимально \(k_8=3\). Дробь \(8/3\) несократима, так что \(q=3\). Простое число 3 запрещено для конечной десятичной записи, поэтому \(M(8)=512/27\) бесконечно в десятичной форме, и \(D(8)=+8\).
После вывода правила знака оставшаяся часть задачи полностью распадается по значениям \(n\). Для каждого \(n\in[5,10000]\) отдельно находится оптимальное \(k_n\), затем вычисляется \(q=k_n/\gcd(n,k_n)\), после чего определяется, содержит ли \(q\) простые множители, отличные от 2 и 5. Так и накапливается сумма
$$\sum_{n=5}^{10000} D(n).$$
Реализации на C++, Python и Java следуют одному и тому же математическому плану. Сначала для каждого \(n\) выбирается оптимальное число частей. В версии на C++ для надежности сравниваются два соседних целых вокруг \(n/e\) через логарифмический показатель \(k(\log n-\log k)\). В версиях на Python и Java берется ближайшее целое к \(n/e\), что эквивалентно той же вогнутой оптимизации.
Затем код вычисляет сокращенный знаменатель дроби \(n/k\) как \(k/\gcd(n,k)\). Из этого числа по очереди удаляются все множители 2 и 5. Если в конце остается 1, то максимальное произведение имеет конечную десятичную запись, и в ответ добавляется \(-n\). Иначе добавляется \(+n\).
Нигде не требуется строить само значение \(M(n)\). Логарифмы решают задачу максимизации, а критерий по знаменателю решает вопрос о конечной десятичной записи.
Каждое значение \(n\) обрабатывается независимо от остальных. На один шаг приходится одна маленькая численная оптимизация, одно вычисление НОД и короткий цикл деления на 2 и 5. НОД считается за \(O(\log n)\), и тот же порядок имеет удаление множителей в худшем случае.
Если верхняя граница равна \(U\), общее время работы составляет \(O(U\log U)\). Для диапазона до 10000 это очень легкий проход. Дополнительная память равна \(O(1)\).
لكل عدد صحيح \(n\ge 5\)، نقسم \(n\) إلى \(k\) أجزاء حقيقية متساوية، فيكون كل جزء مساويًا لـ \(n/k\). عندئذ يكون حاصل الضرب المرتبط بهذا التقسيم هو
$$M(n,k)=\left(\frac{n}{k}\right)^k.$$
نختار من بين كل القيم الصحيحة الموجبة لـ \(k\) القيمة التي تعظّم هذا المقدار، ونسمّي القيمة العظمى الناتجة \(M(n)\). بعد ذلك نعرّف \(D(n)\) بحسب التمثيل العشري لـ \(M(n)\): إذا كان \(M(n)\) ذا تمثيل عشري منتهٍ فإن \(D(n)=-n\)، وإلا فإن \(D(n)=+n\).
المطلوب هو جمع قيم \(D(n)\) لكل \(n\) من 5 إلى 10000. الصعوبة الحقيقية ليست في حساب قوى ضخمة مباشرة، بل في تحديد \(k\) المثلى ثم تقرير شرط الانتهاء العشري بطريقة عددية نظيفة وسريعة.
يعتمد الحل على حقيقتين واضحتين ومتصّلتين مباشرة ببنية المسألة. الأولى أن عدد الأجزاء المثالي يقع دائمًا قرب \(n/e\). والثانية أن الحكم على انتهاء التمثيل العشري يمكن اختزاله إلى النظر في المقام بعد تبسيط الكسر \(n/k\).
لعدد ثابت \(n\) نعرّف
$$f_n(k)=\left(\frac{n}{k}\right)^k.$$
ومن الأسهل مقارنة اللوغاريتم بدل مقارنة القوى نفسها، لذا ندرس
$$\phi_n(x)=\log f_n(x)=x(\log n-\log x),\qquad x>0.$$
وباشتقاقها نحصل على
$$\phi_n'(x)=\log\!\left(\frac{n}{x}\right)-1,\qquad \phi_n''(x)=-\frac{1}{x}\lt 0.$$
بما أن المشتقة الثانية سالبة دائمًا، فالدالة \(\phi_n\) تقعرية تمامًا ولها قيمة عظمى حقيقية وحيدة. بحل المعادلة \(\phi_n'(x)=0\) نجد أن الموضع الأمثل هو
$$x=\frac{n}{e}.$$
إذن أفضل قيمة صحيحة لـ \(k\) لا بد أن تكون من بين الأعداد الصحيحة الأقرب إلى \(n/e\). عمليًا يكفي إما تقريب \(n/e\) إلى أقرب عدد صحيح، أو مقارنة الجارين \(\lfloor n/e\rfloor\) و\(\lfloor n/e\rfloor+1\) باستعمال الصيغة اللوغاريتمية.
لنرمز إلى القيمة المثلى بـ \(k_n\). نبسّط الكسر \(n/k_n\) إلى أبسط صورة:
$$\frac{n}{k_n}=\frac{a}{q},\qquad \gcd(a,q)=1.$$
عندئذ
$$M(n)=\left(\frac{n}{k_n}\right)^{k_n}=\left(\frac{a}{q}\right)^{k_n}=\frac{a^{k_n}}{q^{k_n}}.$$
ولأن \(a\) و\(q\) أوليان فيما بينهما، فإن \(a^{k_n}\) و\(q^{k_n}\) يبقيان كذلك. هذا يعني أن الكسر السابق مختزل أصلًا، وأن مقام \(M(n)\) في صورته المختزلة هو بالضبط \(q^{k_n}\).
ومن المعروف أن العدد النسبي يملك تمثيلًا عشريًا منتهيًا إذا وفقط إذا كان مقامه المختزل لا يحتوي إلا على العاملين الأوليين 2 و5. لذلك يكون \(M(n)\) منتهيًا بالضبط عندما يكون
$$q=2^\alpha 5^\beta.$$
وهذا يفسّر تمامًا الاختبار الذي تطبّقه الحلول:
$$q=\frac{k_n}{\gcd(n,k_n)}.$$
بعد حساب هذا \(q\)، تُزال منه جميع عوامل 2 و5. إذا انتهينا إلى 1 فالناتج عشري منتهٍ، وإلا فلا.
لنأخذ \(n=11\). بما أن \(11/e\approx 4.046\)، فالمقارنة المهمة تكون بين \(k=4\) و\(k=5\):
$$\left(\frac{11}{4}\right)^4=57.19140625,\qquad \left(\frac{11}{5}\right)^5=51.53632.$$
إذًا القيمة المثلى هي \(k_{11}=4\). والكسر \(11/4\) مختزل أصلًا، لذا \(q=4=2^2\). وعليه فإن
$$M(11)=\left(\frac{11}{4}\right)^4=\frac{14641}{256}$$
ذو تمثيل عشري منتهٍ، ومن ثم \(D(11)=-11\).
أما إذا أخذنا \(n=8\)، فالقيمة المثلى هي \(k_8=3\). عندها \(8/3\) مختزل، وبالتالي \(q=3\). وبما أن 3 ليس من العوامل المسموح بها للمقام العشري المنتهي، فإن \(M(8)=512/27\) غير منتهٍ عشريًا، ولذلك \(D(8)=+8\).
بعد تثبيت معيار الإشارة، تصبح المسألة منفصلة تمامًا بحسب \(n\). لكل \(n\in[5,10000]\) نحدد \(k_n\)، ثم نحسب
$$q=\frac{k_n}{\gcd(n,k_n)},$$
ونفحص هل يبقى فيه أي عامل أولي غير 2 و5 بعد الاختزال. عندئذ تُبنى الكمية
$$\sum_{n=5}^{10000} D(n)$$
بمجرد حلقة تراكمية بسيطة، لأن كل قيمة من قيم \(n\) مستقلة عن غيرها.
تتبع تطبيقات C++ وPython وJava السلسلة الرياضية نفسها. الخطوة الأولى هي اختيار عدد الأجزاء الذي يحقق القيمة العظمى. في تنفيذ C++ يتم أخذ الجارين الأقرب إلى \(n/e\) ثم مقارنتهما عبر القيمة اللوغاريتمية \(k(\log n-\log k)\). أما التنفيذان في Python وJava فيأخذان أقرب عدد صحيح إلى \(n/e\)، وهو نفس الاستنتاج المستمد من تقعر الدالة.
بعد اختيار \(k\)، تحسب الشيفرة المقام المختزل للكسر \(n/k\) على صورة \(k/\gcd(n,k)\). ثم تزيل جميع عوامل 2 و5 من هذا المقام. إذا أصبح الباقي 1 أُضيفت القيمة \(-n\) إلى المجموع، وإلا أُضيفت \(+n\).
الميزة الأساسية هنا أن التنفيذ لا يحتاج إطلاقًا إلى تكوين \(\left(n/k\right)^k\) نفسها. اللوغاريتمات تكفي لإيجاد \(k\) المثلى، واختبار المقام يكفي لتقرير طبيعة التمثيل العشري.
تُعالج كل قيمة \(n\) بصورة مستقلة. في كل مرة توجد خطوة تحسين عددية صغيرة، وحساب واحد للقاسم المشترك الأكبر، ثم حلقة قصيرة لإزالة عوامل 2 و5. حساب \(\gcd\) يكلّف \(O(\log n)\)، وكذلك فإن عملية إزالة العوامل تبقى ضمن \(O(\log n)\) في أسوأ الأحوال.
إذا كان الحد الأعلى هو \(U\)، فإن التعقيد الزمني الكلي يساوي \(O(U\log U)\). وفي المجال المحدد هنا حتى 10000، يكون التنفيذ عمليًا مسحًا خفيفًا جدًا. أما الذاكرة الإضافية فهي \(O(1)\).