Problem Summary

Let \(p_m\#=\prod_{i=1}^{m} p_i\) be the primorial of the first \(m\) primes, let \(\tau(n)\) be the divisor-counting function, and define

$$S(N)=\sum_{d \mid N}\tau(d)-\tau(N),\qquad E(m,n)=v_2\!\left(S\!\left((p_m\#)^n\right)\right).$$

The required quantity is the cumulative sum

$$Q(m,N)=\sum_{n=1}^{N}E(m,n).$$

For the actual problem instance, \(m=904961\) and \(N=10^{12}\). Because that \(m\) is odd and \(N\) is enormous, the solution must turn the divisor expression into a closed formula rather than evaluating every term separately.

Mathematical Approach

The key observation is that a primorial power has exactly \(m\) distinct prime factors and all of them appear with the same exponent \(n\). That symmetry makes both the divisor sum and the \(2\)-adic valuation collapse into elementary arithmetic.

Step 1: Expand the divisor expression on a primorial power

For \(N=(p_m\#)^n\), each of the \(m\) primes has exponent \(n\), so

$$\tau\!\left((p_m\#)^n\right)=(n+1)^m.$$

Every divisor is obtained by choosing one exponent from \(0\) to \(n\) independently for each prime. Therefore

$$\sum_{d \mid (p_m\#)^n}\tau(d)=\left(\sum_{k=0}^{n}(k+1)\right)^m=\left(\frac{(n+1)(n+2)}{2}\right)^m.$$

Substituting this into the definition of \(S\) gives

$$S\!\left((p_m\#)^n\right)=\left(\frac{(n+1)(n+2)}{2}\right)^m-(n+1)^m.$$

Step 2: Evaluate the odd case

Let \(n=2k-1\). Then \(n+1=2k\) and \(n+2=2k+1\), so

$$S\!\left((p_m\#)^{2k-1}\right)=\bigl(k(2k+1)\bigr)^m-(2k)^m=k^m\left((2k+1)^m-2^m\right).$$

The bracketed factor is odd, because an odd number minus an even number is odd. Hence the entire \(2\)-adic valuation comes from the factor \(k^m\):

$$E(m,2k-1)=m\,v_2(k)=m\,v_2\!\left(\frac{n+1}{2}\right).$$

Step 3: Evaluate the even case

Let \(n=2r\). Then \(n+1=2r+1\) is odd, and the same identity becomes

$$S\!\left((p_m\#)^{2r}\right)=\bigl((2r+1)(r+1)\bigr)^m-(2r+1)^m=(2r+1)^m\left((r+1)^m-1\right).$$

Now split according to the residue of \(n\) modulo \(4\).

If \(r\) is odd, then \(n\equiv 2 \pmod 4\) and \(r+1\) is even, so \((r+1)^m-1\) is odd. Therefore

$$E(m,n)=0 \qquad \text{when } n\equiv 2 \pmod 4.$$

If \(r=2t\), then \(n=4t\) and \(r+1=2t+1\) is odd. Since \(m=904961\) is odd,

$$\begin{aligned} (2t+1)^m-1&=(2t)\left((2t+1)^{m-1}+(2t+1)^{m-2}+\cdots+1\right). \end{aligned}$$

The parenthesized sum is odd because it contains an odd number of odd terms. Hence

$$E(m,4t)=v_2(2t)=1+v_2(t)=v_2(n)-1.$$

For this odd \(m\), the valuation rule is therefore

$$E(m,n)= \begin{cases} m\,v_2\!\left(\frac{n+1}{2}\right), & n \text{ odd},\\ 0, & n\equiv 2 \pmod 4,\\ v_2(n)-1, & 4\mid n. \end{cases}$$

Step 4: Sum the residue classes

We now sum \(E(m,n)\) from \(1\) to \(N\). The class \(n\equiv 2 \pmod 4\) contributes nothing, so only odd numbers and multiples of \(4\) remain.

For odd \(n\), write \(n=2k-1\) with

$$K=\left\lfloor\frac{N+1}{2}\right\rfloor.$$

Then

$$\sum_{\substack{1\le n\le N\\ n\text{ odd}}}E(m,n)=m\sum_{k=1}^{K}v_2(k)=m\,v_2(K!).$$

For multiples of \(4\), write \(n=4t\) with

$$T=\left\lfloor\frac{N}{4}\right\rfloor.$$

Then

$$\sum_{\substack{1\le n\le N\\ 4\mid n}}E(m,n)=\sum_{t=1}^{T}\bigl(1+v_2(t)\bigr)=T+v_2(T!).$$

So the whole cumulative quantity reduces to

$$Q(m,N)=m\,v_2(K!)+T+v_2(T!).$$

Step 5: Replace factorial valuations with Legendre's formula

Legendre's formula for the prime \(2\) says

$$v_2(x!)=\sum_{j\ge 1}\left\lfloor\frac{x}{2^j}\right\rfloor=x-\operatorname{popcount}(x).$$

This turns the final sum into direct arithmetic:

$$Q(m,N)=m\left(K-\operatorname{popcount}(K)\right)+T+\left(T-\operatorname{popcount}(T)\right).$$

No iteration up to \(N\) survives the derivation.

Worked Example: \(N=8\)

This checkpoint is small enough to verify by hand and already shows the full mechanism. Here

$$K=\left\lfloor\frac{8+1}{2}\right\rfloor=4,\qquad T=\left\lfloor\frac{8}{4}\right\rfloor=2.$$

Using Legendre,

$$v_2(4!)=4-\operatorname{popcount}(4)=4-1=3,\qquad v_2(2!)=2-\operatorname{popcount}(2)=2-1=1.$$

Therefore

$$Q(m,8)=3m+3.$$

For the actual problem parameter \(m=904961\), this becomes

$$Q(904961,8)=3\cdot 904961+3=2714886,$$

which matches the checkpoint used by the implementations.

How the Code Works

The C++, Python, and Java implementations never loop from \(1\) to \(N\). They apply the closed form derived above directly to the odd input \(m=904961\).

Each implementation computes

$$K=\left\lfloor\frac{N+1}{2}\right\rfloor,\qquad T=\left\lfloor\frac{N}{4}\right\rfloor,$$

then evaluates \(v_2(K!)\) and \(v_2(T!)\) via the identity \(x-\operatorname{popcount}(x)\), and finally forms

$$m\,v_2(K!)+T+v_2(T!).$$

The C++ implementation also includes two small sanity checks: one confirms that \(S(6)=5\), and another confirms the checkpoint \(Q(904961,8)=2714886\). After that, the exact decimal answer for \(N=10^{12}\) is printed.

Complexity Analysis

For the fixed-size integer inputs used here, the algorithm runs in \(O(1)\) time and \(O(1)\) memory. The derivation removes every loop over \(n\); only a handful of integer divisions, bit counts, and additions remain.

Footnotes and References

  1. Problem page: https://projecteuler.net/problem=561
  2. Primorial: Wikipedia — Primorial
  3. Divisor function: Wikipedia — Divisor function
  4. \(p\)-adic valuation: Wikipedia — \(p\)-adic valuation
  5. Legendre's formula: Wikipedia — Legendre's formula

Problemzusammenfassung

Sei \(p_m\#=\prod_{i=1}^{m} p_i\) das Primorial der ersten \(m\) Primzahlen, \(\tau(n)\) die Teileranzahlfunktion und

$$S(N)=\sum_{d \mid N}\tau(d)-\tau(N),\qquad E(m,n)=v_2\!\left(S\!\left((p_m\#)^n\right)\right).$$

Gesucht ist die kumulative Summe

$$Q(m,N)=\sum_{n=1}^{N}E(m,n).$$

Im eigentlichen Problem gilt \(m=904961\) und \(N=10^{12}\). Weil dieses \(m\) ungerade ist und \(N\) viel zu groß für direkte Aufzählung wäre, muss man die Formel algebraisch vereinfachen.

Mathematischer Ansatz

Bei einer Primorialpotenz treten genau \(m\) verschiedene Primzahlen auf, und jede hat denselben Exponenten \(n\). Gerade diese Symmetrie macht sowohl die Teilersumme als auch die \(2\)-adische Bewertung beherrschbar.

Schritt 1: Den Teilerausdruck für eine Primorialpotenz ausklappen

Für \(N=(p_m\#)^n\) hat jede der \(m\) Primzahlen den Exponenten \(n\), also gilt

$$\tau\!\left((p_m\#)^n\right)=(n+1)^m.$$

Jeder Teiler entsteht, indem man für jede Primzahl unabhängig einen Exponenten zwischen \(0\) und \(n\) wählt. Daher

$$\sum_{d \mid (p_m\#)^n}\tau(d)=\left(\sum_{k=0}^{n}(k+1)\right)^m=\left(\frac{(n+1)(n+2)}{2}\right)^m.$$

Damit wird

$$S\!\left((p_m\#)^n\right)=\left(\frac{(n+1)(n+2)}{2}\right)^m-(n+1)^m.$$

Schritt 2: Der Fall ungerades \(n\)

Setze \(n=2k-1\). Dann sind \(n+1=2k\) und \(n+2=2k+1\), also

$$S\!\left((p_m\#)^{2k-1}\right)=\bigl(k(2k+1)\bigr)^m-(2k)^m=k^m\left((2k+1)^m-2^m\right).$$

Der Klammerausdruck ist ungerade, denn eine ungerade Zahl minus eine gerade Zahl bleibt ungerade. Folglich stammt die gesamte \(2\)-adische Bewertung allein aus \(k^m\):

$$E(m,2k-1)=m\,v_2(k)=m\,v_2\!\left(\frac{n+1}{2}\right).$$

Schritt 3: Der Fall gerades \(n\)

Setze \(n=2r\). Dann ist \(n+1=2r+1\) ungerade, und dieselbe Identität liefert

$$S\!\left((p_m\#)^{2r}\right)=\bigl((2r+1)(r+1)\bigr)^m-(2r+1)^m=(2r+1)^m\left((r+1)^m-1\right).$$

Nun entscheidet die Restklasse von \(n\) modulo \(4\).

Ist \(r\) ungerade, dann gilt \(n\equiv 2 \pmod 4\), also ist \(r+1\) gerade und \((r+1)^m-1\) ungerade. Deshalb

$$E(m,n)=0 \qquad \text{if } n\equiv 2 \pmod 4.$$

Ist dagegen \(r=2t\), also \(n=4t\), dann ist \(r+1=2t+1\) ungerade. Weil \(m=904961\) ungerade ist, folgt

$$\begin{aligned} (2t+1)^m-1&=(2t)\left((2t+1)^{m-1}+(2t+1)^{m-2}+\cdots+1\right). \end{aligned}$$

Die Summe in der Klammer ist ungerade, da sie aus einer ungeraden Anzahl ungerader Summanden besteht. Also

$$E(m,4t)=v_2(2t)=1+v_2(t)=v_2(n)-1.$$

Für dieses ungerade \(m\) ergibt sich somit die Stückformel

$$E(m,n)= \begin{cases} m\,v_2\!\left(\frac{n+1}{2}\right), & n \text{ odd},\\ 0, & n\equiv 2 \pmod 4,\\ v_2(n)-1, & 4\mid n. \end{cases}$$

Schritt 4: Die Restklassen aufsummieren

Jetzt wird \(E(m,n)\) von \(1\) bis \(N\) summiert. Die Klasse \(n\equiv 2 \pmod 4\) trägt nichts bei, also bleiben nur ungerade \(n\) und Vielfache von \(4\).

Für ungerade \(n\) schreiben wir \(n=2k-1\) mit

$$K=\left\lfloor\frac{N+1}{2}\right\rfloor.$$

Dann gilt

$$\sum_{\substack{1\le n\le N\\ n\text{ odd}}}E(m,n)=m\sum_{k=1}^{K}v_2(k)=m\,v_2(K!).$$

Für Vielfache von \(4\) schreiben wir \(n=4t\) mit

$$T=\left\lfloor\frac{N}{4}\right\rfloor.$$

Dann folgt

$$\sum_{\substack{1\le n\le N\\ 4\mid n}}E(m,n)=\sum_{t=1}^{T}\bigl(1+v_2(t)\bigr)=T+v_2(T!).$$

Die gesamte Summe reduziert sich also auf

$$Q(m,N)=m\,v_2(K!)+T+v_2(T!).$$

Schritt 5: Fakultätsbewertungen mit Legendre ersetzen

Legendres Formel für die Primzahl \(2\) lautet

$$v_2(x!)=\sum_{j\ge 1}\left\lfloor\frac{x}{2^j}\right\rfloor=x-\operatorname{popcount}(x).$$

Damit wird die Endform zu einer unmittelbaren Ganzzahlrechnung:

$$Q(m,N)=m\left(K-\operatorname{popcount}(K)\right)+T+\left(T-\operatorname{popcount}(T)\right).$$

Es bleibt also keinerlei Schleife bis \(N\) übrig.

Durchgerechnetes Beispiel: \(N=8\)

Dieser Kontrollwert ist klein genug für Handrechnung und zeigt bereits das ganze Muster. Hier ist

$$K=\left\lfloor\frac{8+1}{2}\right\rfloor=4,\qquad T=\left\lfloor\frac{8}{4}\right\rfloor=2.$$

Mit Legendre erhält man

$$v_2(4!)=4-\operatorname{popcount}(4)=4-1=3,\qquad v_2(2!)=2-\operatorname{popcount}(2)=2-1=1.$$

Daher

$$Q(m,8)=3m+3.$$

Für den eigentlichen Problemwert \(m=904961\) wird daraus

$$Q(904961,8)=3\cdot 904961+3=2714886,$$

genau der Kontrollwert aus den Implementierungen.

Wie der Code arbeitet

Die C++-, Python- und Java-Implementierungen laufen nicht alle Werte von \(1\) bis \(N\) durch. Stattdessen setzen sie die oben hergeleitete geschlossene Formel direkt für das ungerade Eingabe-\(m=904961\) ein.

Dazu werden zunächst

$$K=\left\lfloor\frac{N+1}{2}\right\rfloor,\qquad T=\left\lfloor\frac{N}{4}\right\rfloor$$

berechnet, anschließend \(v_2(K!)\) und \(v_2(T!)\) über die Identität \(x-\operatorname{popcount}(x)\) ausgewertet und schließlich

$$m\,v_2(K!)+T+v_2(T!)$$

gebildet. Die C++-Implementierung enthält zusätzlich zwei kleine Plausibilitätsprüfungen: einmal \(S(6)=5\) und einmal den Kontrollwert \(Q(904961,8)=2714886\). Danach wird die exakte Dezimalzahl für \(N=10^{12}\) ausgegeben.

Komplexitätsanalyse

Für die hier verwendeten Eingaben fester Maschinenwortgröße läuft das Verfahren in \(O(1)\) Zeit und benötigt \(O(1)\) Speicher. Die gesamte Schleife über \(n\) wurde wegtransformiert; übrig bleiben nur einige Ganzzahldivisionen, Bitzählungen und Additionen.

Fußnoten und Quellen

  1. Problemseite: https://projecteuler.net/problem=561
  2. Primorial: Wikipedia — Primorial
  3. Teilerfunktion: Wikipedia — Divisor function
  4. \(p\)-adische Bewertung: Wikipedia — \(p\)-adic valuation
  5. Legendre-Formel: Wikipedia — Legendre's formula

Problem Özeti

\(p_m\#=\prod_{i=1}^{m} p_i\) ilk \(m\) asalın primoriali, \(\tau(n)\) bölen sayısı fonksiyonu olsun. Problem şu nicelikleri tanımlar:

$$S(N)=\sum_{d \mid N}\tau(d)-\tau(N),\qquad E(m,n)=v_2\!\left(S\!\left((p_m\#)^n\right)\right).$$

İstenen toplam ise

$$Q(m,N)=\sum_{n=1}^{N}E(m,n).$$

Gerçek problem girdisinde \(m=904961\) ve \(N=10^{12}\) alınır. Bu \(m\) tek olduğu ve \(N\) devasa olduğu için çözüm, her terimi tek tek hesaplamak yerine kapalı bir form üretmek zorundadır.

Matematiksel Yaklaşım

Bir primorial kuvvetinde tam olarak \(m\) farklı asal bulunur ve hepsi aynı üs \(n\) ile gelir. Bu simetri hem bölen toplamını hem de \(2\)-adik değerlemeyi basit cebirsel ifadelere indirir.

Adım 1: Primorial kuvveti üzerindeki bölen ifadesini aç

\(N=(p_m\#)^n\) için her asalın üssü \(n\) olduğundan

$$\tau\!\left((p_m\#)^n\right)=(n+1)^m.$$

Her bölen, her asal için bağımsız olarak \(0\) ile \(n\) arasında bir üs seçilerek oluşur. Bu yüzden

$$\sum_{d \mid (p_m\#)^n}\tau(d)=\left(\sum_{k=0}^{n}(k+1)\right)^m=\left(\frac{(n+1)(n+2)}{2}\right)^m.$$

Bunu \(S\) tanımına koyunca

$$S\!\left((p_m\#)^n\right)=\left(\frac{(n+1)(n+2)}{2}\right)^m-(n+1)^m$$

elde edilir.

Adım 2: Tek \(n\) durumunu hesapla

\(n=2k-1\) yazalım. O zaman \(n+1=2k\) ve \(n+2=2k+1\) olur; dolayısıyla

$$S\!\left((p_m\#)^{2k-1}\right)=\bigl(k(2k+1)\bigr)^m-(2k)^m=k^m\left((2k+1)^m-2^m\right).$$

Parantez içi ifade tektir; çünkü tek bir sayıdan çift bir sayı çıkarılmaktadır. Bu nedenle tüm \(2\)-adik değerleme yalnızca \(k^m\) çarpanından gelir:

$$E(m,2k-1)=m\,v_2(k)=m\,v_2\!\left(\frac{n+1}{2}\right).$$

Adım 3: Çift \(n\) durumunu hesapla

\(n=2r\) yazalım. Böylece \(n+1=2r+1\) tek olur ve aynı özdeşlik

$$S\!\left((p_m\#)^{2r}\right)=\bigl((2r+1)(r+1)\bigr)^m-(2r+1)^m=(2r+1)^m\left((r+1)^m-1\right)$$

şeklini alır. Şimdi \(n\)'in \(4\)'e göre kalanı belirleyicidir.

\(r\) tekse \(n\equiv 2 \pmod 4\) olur. Bu durumda \(r+1\) çift olduğundan \((r+1)^m-1\) tektir ve

$$E(m,n)=0 \qquad \text{if } n\equiv 2 \pmod 4.$$

\(r=2t\) ise \(n=4t\) ve \(r+1=2t+1\) tektir. \(m=904961\) tek olduğu için

$$\begin{aligned} (2t+1)^m-1&=(2t)\left((2t+1)^{m-1}+(2t+1)^{m-2}+\cdots+1\right). \end{aligned}$$

Parantez içindeki toplam, tek sayıda tek terimin toplamı olduğu için tektir. Bu yüzden

$$E(m,4t)=v_2(2t)=1+v_2(t)=v_2(n)-1.$$

Sonuç olarak, bu tek \(m\) için

$$E(m,n)= \begin{cases} m\,v_2\!\left(\frac{n+1}{2}\right), & n \text{ odd},\\ 0, & n\equiv 2 \pmod 4,\\ v_2(n)-1, & 4\mid n. \end{cases}$$

Adım 4: Kalan sınıflarını topla

Şimdi \(E(m,n)\) değerlerini \(1\) ile \(N\) arasında topluyoruz. \(n\equiv 2 \pmod 4\) sınıfı hiç katkı yapmaz; geriye yalnızca tek sayılar ve \(4\)'ün katları kalır.

Tek \(n\) için \(n=2k-1\) yazıp

$$K=\left\lfloor\frac{N+1}{2}\right\rfloor$$

tanımlarız. O halde

$$\sum_{\substack{1\le n\le N\\ n\text{ odd}}}E(m,n)=m\sum_{k=1}^{K}v_2(k)=m\,v_2(K!).$$

\(4\)'ün katları için \(n=4t\) yazıp

$$T=\left\lfloor\frac{N}{4}\right\rfloor$$

alırız. Bu durumda

$$\sum_{\substack{1\le n\le N\\ 4\mid n}}E(m,n)=\sum_{t=1}^{T}\bigl(1+v_2(t)\bigr)=T+v_2(T!).$$

Dolayısıyla toplam ifade

$$Q(m,N)=m\,v_2(K!)+T+v_2(T!)$$

olur.

Adım 5: Faktöriyel değerlemelerini Legendre ile değiştir

\(2\) asalı için Legendre formülü

$$v_2(x!)=\sum_{j\ge 1}\left\lfloor\frac{x}{2^j}\right\rfloor=x-\operatorname{popcount}(x)$$

şeklindedir. Böylece son toplam doğrudan

$$Q(m,N)=m\left(K-\operatorname{popcount}(K)\right)+T+\left(T-\operatorname{popcount}(T)\right)$$

olarak hesaplanır. Artık \(N\)'ye kadar giden hiçbir döngü kalmaz.

Çözümlü Örnek: \(N=8\)

Bu kontrol örneği elle doğrulanabilecek kadar küçüktür ama tüm mekanizmayı gösterir. Burada

$$K=\left\lfloor\frac{8+1}{2}\right\rfloor=4,\qquad T=\left\lfloor\frac{8}{4}\right\rfloor=2.$$

Legendre ile

$$v_2(4!)=4-\operatorname{popcount}(4)=4-1=3,\qquad v_2(2!)=2-\operatorname{popcount}(2)=2-1=1$$

elde edilir. Dolayısıyla

$$Q(m,8)=3m+3.$$

Gerçek problem parametresi \(m=904961\) için bu

$$Q(904961,8)=3\cdot 904961+3=2714886$$

değerini verir; bu da implementasyonların kullandığı kontrol sonucudur.

Kodun Nasıl Çalıştığı

C++, Python ve Java implementasyonları \(1\)'den \(N\)'ye kadar ilerlemez. Bunun yerine yukarıdaki kapalı formu doğrudan tek problem girdisi \(m=904961\) için uygular.

Önce

$$K=\left\lfloor\frac{N+1}{2}\right\rfloor,\qquad T=\left\lfloor\frac{N}{4}\right\rfloor$$

hesaplanır, sonra \(v_2(K!)\) ve \(v_2(T!)\) değerleri \(x-\operatorname{popcount}(x)\) özdeşliğiyle bulunur ve en son

$$m\,v_2(K!)+T+v_2(T!)$$

oluşturulur. C++ implementasyonu ayrıca iki küçük doğrulama içerir: biri \(S(6)=5\) sonucunu, diğeri ise \(Q(904961,8)=2714886\) kontrolünü sınar. Son adımda \(N=10^{12}\) için tam ondalık sonuç yazdırılır.

Karmaşıklık Analizi

Buradaki sabit boyutlu tamsayı girdileri için algoritma \(O(1)\) zamanda ve \(O(1)\) bellekte çalışır. Türetilen kapalı form sayesinde \(n\) üzerinde büyüyen hiçbir döngü yoktur; sadece birkaç bölme, bit sayma ve toplama işlemi yapılır.

Dipnotlar ve Kaynakça

  1. Problem sayfası: https://projecteuler.net/problem=561
  2. Primorial: Wikipedia — Primorial
  3. Bölen fonksiyonu: Wikipedia — Divisor function
  4. \(p\)-adik değerleme: Wikipedia — \(p\)-adic valuation
  5. Legendre formülü: Wikipedia — Legendre's formula

Resumen del Problema

Sea \(p_m\#=\prod_{i=1}^{m} p_i\) el primorial de los primeros \(m\) primos, sea \(\tau(n)\) la función que cuenta divisores, y definamos

$$S(N)=\sum_{d \mid N}\tau(d)-\tau(N),\qquad E(m,n)=v_2\!\left(S\!\left((p_m\#)^n\right)\right).$$

La cantidad pedida es la suma acumulada

$$Q(m,N)=\sum_{n=1}^{N}E(m,n).$$

En la instancia real del problema, \(m=904961\) y \(N=10^{12}\). Como ese \(m\) es impar y \(N\) es gigantesco, no se puede recorrer término a término; hay que obtener una expresión cerrada.

Enfoque Matemático

Una potencia de primorial tiene exactamente \(m\) factores primos distintos y todos aparecen con el mismo exponente \(n\). Esa regularidad permite reducir tanto la suma de divisores como la valoración \(2\)-ádica a unas pocas identidades elementales.

Paso 1: Expandir la expresión de divisores sobre una potencia de primorial

Si \(N=(p_m\#)^n\), cada uno de los \(m\) primos tiene exponente \(n\), de modo que

$$\tau\!\left((p_m\#)^n\right)=(n+1)^m.$$

Cada divisor se obtiene eligiendo de forma independiente un exponente entre \(0\) y \(n\) para cada primo. Por tanto,

$$\sum_{d \mid (p_m\#)^n}\tau(d)=\left(\sum_{k=0}^{n}(k+1)\right)^m=\left(\frac{(n+1)(n+2)}{2}\right)^m.$$

Al sustituir en la definición de \(S\), resulta

$$S\!\left((p_m\#)^n\right)=\left(\frac{(n+1)(n+2)}{2}\right)^m-(n+1)^m.$$

Paso 2: Resolver el caso impar

Escribamos \(n=2k-1\). Entonces \(n+1=2k\) y \(n+2=2k+1\), así que

$$S\!\left((p_m\#)^{2k-1}\right)=\bigl(k(2k+1)\bigr)^m-(2k)^m=k^m\left((2k+1)^m-2^m\right).$$

El factor entre paréntesis es impar, porque un número impar menos uno par sigue siendo impar. En consecuencia, toda la valoración \(2\)-ádica procede de \(k^m\):

$$E(m,2k-1)=m\,v_2(k)=m\,v_2\!\left(\frac{n+1}{2}\right).$$

Paso 3: Resolver el caso par

Ahora escribamos \(n=2r\). Entonces \(n+1=2r+1\) es impar, y la misma identidad se reescribe como

$$S\!\left((p_m\#)^{2r}\right)=\bigl((2r+1)(r+1)\bigr)^m-(2r+1)^m=(2r+1)^m\left((r+1)^m-1\right).$$

Aquí importa la clase residual de \(n\) módulo \(4\).

Si \(r\) es impar, entonces \(n\equiv 2 \pmod 4\), luego \(r+1\) es par y \((r+1)^m-1\) es impar. Por tanto,

$$E(m,n)=0 \qquad \text{if } n\equiv 2 \pmod 4.$$

Si \(r=2t\), entonces \(n=4t\) y \(r+1=2t+1\) es impar. Como \(m=904961\) es impar, se tiene

$$\begin{aligned} (2t+1)^m-1&=(2t)\left((2t+1)^{m-1}+(2t+1)^{m-2}+\cdots+1\right). \end{aligned}$$

La suma entre paréntesis es impar porque contiene un número impar de términos impares. Así,

$$E(m,4t)=v_2(2t)=1+v_2(t)=v_2(n)-1.$$

Para este \(m\) impar queda la regla por casos

$$E(m,n)= \begin{cases} m\,v_2\!\left(\frac{n+1}{2}\right), & n \text{ odd},\\ 0, & n\equiv 2 \pmod 4,\\ v_2(n)-1, & 4\mid n. \end{cases}$$

Paso 4: Sumar las clases residuales

Ahora sumamos \(E(m,n)\) desde \(1\) hasta \(N\). La clase \(n\equiv 2 \pmod 4\) no aporta nada, de modo que solo quedan los impares y los múltiplos de \(4\).

Para los impares, escribimos \(n=2k-1\) con

$$K=\left\lfloor\frac{N+1}{2}\right\rfloor.$$

Entonces

$$\sum_{\substack{1\le n\le N\\ n\text{ odd}}}E(m,n)=m\sum_{k=1}^{K}v_2(k)=m\,v_2(K!).$$

Para los múltiplos de \(4\), escribimos \(n=4t\) con

$$T=\left\lfloor\frac{N}{4}\right\rfloor.$$

Luego

$$\sum_{\substack{1\le n\le N\\ 4\mid n}}E(m,n)=\sum_{t=1}^{T}\bigl(1+v_2(t)\bigr)=T+v_2(T!).$$

Por tanto, toda la cantidad acumulada se reduce a

$$Q(m,N)=m\,v_2(K!)+T+v_2(T!).$$

Paso 5: Sustituir las valoraciones factoriales por la fórmula de Legendre

Para el primo \(2\), la fórmula de Legendre dice

$$v_2(x!)=\sum_{j\ge 1}\left\lfloor\frac{x}{2^j}\right\rfloor=x-\operatorname{popcount}(x).$$

Eso convierte el resultado final en una cuenta directa:

$$Q(m,N)=m\left(K-\operatorname{popcount}(K)\right)+T+\left(T-\operatorname{popcount}(T)\right).$$

Después de esta reducción ya no queda ningún recorrido hasta \(N\).

Ejemplo trabajado: \(N=8\)

Este punto de control es lo bastante pequeño para comprobarlo a mano y, al mismo tiempo, ya contiene toda la idea. Aquí

$$K=\left\lfloor\frac{8+1}{2}\right\rfloor=4,\qquad T=\left\lfloor\frac{8}{4}\right\rfloor=2.$$

Con Legendre obtenemos

$$v_2(4!)=4-\operatorname{popcount}(4)=4-1=3,\qquad v_2(2!)=2-\operatorname{popcount}(2)=2-1=1.$$

Así,

$$Q(m,8)=3m+3.$$

Para el valor real \(m=904961\), esto da

$$Q(904961,8)=3\cdot 904961+3=2714886,$$

que coincide exactamente con el punto de control de las implementaciones.

Cómo funciona el código

Las implementaciones en C++, Python y Java no iteran desde \(1\) hasta \(N\). Aplican directamente la fórmula cerrada anterior al valor impar \(m=904961\).

Cada implementación calcula

$$K=\left\lfloor\frac{N+1}{2}\right\rfloor,\qquad T=\left\lfloor\frac{N}{4}\right\rfloor,$$

evalúa \(v_2(K!)\) y \(v_2(T!)\) mediante la identidad \(x-\operatorname{popcount}(x)\), y finalmente forma

$$m\,v_2(K!)+T+v_2(T!).$$

La implementación en C++ añade además dos comprobaciones pequeñas: una verifica que \(S(6)=5\) y otra verifica el control \(Q(904961,8)=2714886\). Después se imprime la respuesta decimal exacta para \(N=10^{12}\).

Análisis de Complejidad

Para las entradas de tamaño fijo usadas aquí, el algoritmo trabaja en tiempo \(O(1)\) y memoria \(O(1)\). La derivación elimina cualquier bucle proporcional a \(N\); solo quedan unas pocas divisiones enteras, recuentos de bits y sumas.

Notas y Referencias

  1. Página del problema: https://projecteuler.net/problem=561
  2. Primorial: Wikipedia — Primorial
  3. Función divisor: Wikipedia — Divisor function
  4. Valoración \(p\)-ádica: Wikipedia — \(p\)-adic valuation
  5. Fórmula de Legendre: Wikipedia — Legendre's formula

问题概述

设 \(p_m\#=\prod_{i=1}^{m} p_i\) 表示前 \(m\) 个素数的 primorial,\(\tau(n)\) 表示约数个数函数,并定义

$$S(N)=\sum_{d \mid N}\tau(d)-\tau(N),\qquad E(m,n)=v_2\!\left(S\!\left((p_m\#)^n\right)\right).$$

题目要求计算累计量

$$Q(m,N)=\sum_{n=1}^{N}E(m,n).$$

实际参数是 \(m=904961\) 与 \(N=10^{12}\)。由于这个 \(m\) 是奇数,而 \(N\) 又大到不可能逐项枚举,解法必须先把表达式化成闭式,再一次性求值。

数学方法

对于 \((p_m\#)^n\) 这种数,它的素因子结构极其整齐:恰好有 \(m\) 个不同素数,而且每个素数的指数都同样是 \(n\)。正是这个对称性,使得约数和与 \(2\)-进赋值都可以被压缩成很短的公式。

步骤 1:先把 primorial 幂上的约数表达式完全展开

对 \(N=(p_m\#)^n\) 来说,每个素数的指数都是 \(n\),因此

$$\tau\!\left((p_m\#)^n\right)=(n+1)^m.$$

任意一个约数都对应于:对这 \(m\) 个素数分别独立地选一个从 \(0\) 到 \(n\) 的指数。所以

$$\sum_{d \mid (p_m\#)^n}\tau(d)=\left(\sum_{k=0}^{n}(k+1)\right)^m=\left(\frac{(n+1)(n+2)}{2}\right)^m.$$

代回定义之后,就得到一个精确闭式:

$$S\!\left((p_m\#)^n\right)=\left(\frac{(n+1)(n+2)}{2}\right)^m-(n+1)^m.$$

后面的全部推导,都从这条式子出发。

步骤 2:处理奇数 \(n\)

令 \(n=2k-1\)。这时 \(n+1=2k\),\(n+2=2k+1\),于是

$$S\!\left((p_m\#)^{2k-1}\right)=\bigl(k(2k+1)\bigr)^m-(2k)^m=k^m\left((2k+1)^m-2^m\right).$$

括号中的 \((2k+1)^m-2^m\) 一定是奇数,因为奇数减偶数仍是奇数。因此 \(2\)-进赋值完全来自前面的 \(k^m\):

$$E(m,2k-1)=m\,v_2(k)=m\,v_2\!\left(\frac{n+1}{2}\right).$$

也就是说,只要 \(n\) 为奇数,问题就退化成“\((n+1)/2\) 中含有多少个因子 \(2\)”这一件事。

步骤 3:处理偶数 \(n\)

再令 \(n=2r\)。此时 \(n+1=2r+1\) 是奇数,同样的闭式可以改写为

$$S\!\left((p_m\#)^{2r}\right)=\bigl((2r+1)(r+1)\bigr)^m-(2r+1)^m=(2r+1)^m\left((r+1)^m-1\right).$$

这里真正需要分析的是 \((r+1)^m-1\) 的 \(2\)-进赋值,而结论取决于 \(n\) 对 \(4\) 的余数。

如果 \(r\) 是奇数,那么 \(n\equiv 2 \pmod 4\)。这时 \(r+1\) 是偶数,于是 \((r+1)^m\) 为偶数,\((r+1)^m-1\) 就是奇数,所以

$$E(m,n)=0 \qquad \text{if } n\equiv 2 \pmod 4.$$

如果 \(r=2t\),那么 \(n=4t\),并且 \(r+1=2t+1\) 是奇数。由于实际问题中的 \(m=904961\) 本身也是奇数,可以写出

$$\begin{aligned} (2t+1)^m-1&=(2t)\left((2t+1)^{m-1}+(2t+1)^{m-2}+\cdots+1\right). \end{aligned}$$

括号里是 \(m\) 个奇数的和,而 \(m\) 又是奇数,因此整个括号仍然是奇数。于是所有的 \(2\)-进因子只来自最前面的 \(2t\),从而

$$E(m,4t)=v_2(2t)=1+v_2(t)=v_2(n)-1.$$

把三种情况合并起来,对于这个奇数 \(m\) 就得到

$$E(m,n)= \begin{cases} m\,v_2\!\left(\frac{n+1}{2}\right), & n \text{ odd},\\ 0, & n\equiv 2 \pmod 4,\\ v_2(n)-1, & 4\mid n. \end{cases}$$

步骤 4:把三类 \(n\) 的贡献分别求和

接下来要求的是

$$Q(m,N)=\sum_{n=1}^{N}E(m,n).$$

其中第二类 \(n\equiv 2 \pmod 4\) 的项全部为零,所以实际上只需处理奇数项与 \(4\) 的倍数项。

对奇数项,写 \(n=2k-1\),其中

$$K=\left\lfloor\frac{N+1}{2}\right\rfloor.$$

于是

$$\sum_{\substack{1\le n\le N\\ n\text{ odd}}}E(m,n)=m\sum_{k=1}^{K}v_2(k)=m\,v_2(K!).$$

这里用到的事实是:从 \(1\) 到 \(K\) 所有整数的 \(2\)-进赋值之和,恰好就是 \(K!\) 的 \(2\)-进赋值。

对 \(4\) 的倍数项,写 \(n=4t\),其中

$$T=\left\lfloor\frac{N}{4}\right\rfloor.$$

这部分的和变成

$$\sum_{\substack{1\le n\le N\\ 4\mid n}}E(m,n)=\sum_{t=1}^{T}\bigl(1+v_2(t)\bigr)=T+v_2(T!).$$

因此整个题目最终压缩成

$$Q(m,N)=m\,v_2(K!)+T+v_2(T!).$$

步骤 5:用 Legendre 公式把阶乘赋值改写成位运算

对素数 \(2\),Legendre 公式给出

$$v_2(x!)=\sum_{j\ge 1}\left\lfloor\frac{x}{2^j}\right\rfloor=x-\operatorname{popcount}(x).$$

这里的 \(\operatorname{popcount}(x)\) 表示 \(x\) 的二进制表示中 \(1\) 的个数。代入之后,最后公式直接变成

$$Q(m,N)=m\left(K-\operatorname{popcount}(K)\right)+T+\left(T-\operatorname{popcount}(T)\right).$$

也就是说,整个答案只依赖于两次整除、两次 bit count,再做若干次整数加减乘。原本看似要累计到 \(10^{12}\) 的问题,已经完全不需要遍历。

例子:\(N=8\)

这个检查点既足够小,可以手算验证;又足够完整,能把公式的工作方式展示清楚。此时

$$K=\left\lfloor\frac{8+1}{2}\right\rfloor=4,\qquad T=\left\lfloor\frac{8}{4}\right\rfloor=2.$$

根据 Legendre 公式,

$$v_2(4!)=4-\operatorname{popcount}(4)=4-1=3,\qquad v_2(2!)=2-\operatorname{popcount}(2)=2-1=1.$$

于是

$$Q(m,8)=3m+3.$$

对题目里的实际参数 \(m=904961\),马上得到

$$Q(904961,8)=3\cdot 904961+3=2714886,$$

这与实现中使用的校验值完全一致。

代码如何工作

C++、Python 和 Java 实现都不会从 \(1\) 一直循环到 \(N\)。它们直接使用上面推导出的闭式,并代入题目的奇数参数 \(m=904961\)。

实现首先计算

$$K=\left\lfloor\frac{N+1}{2}\right\rfloor,\qquad T=\left\lfloor\frac{N}{4}\right\rfloor,$$

然后利用 \(x-\operatorname{popcount}(x)\) 这一恒等式求出 \(v_2(K!)\) 与 \(v_2(T!)\),最后组合成

$$m\,v_2(K!)+T+v_2(T!).$$

C++ 实现还额外放了两个很小的自检:一个确认 \(S(6)=5\),另一个确认检查点 \(Q(904961,8)=2714886\)。通过这些检查后,程序直接输出 \(N=10^{12}\) 时的十进制精确结果。

复杂度分析

对这里使用的固定大小整数输入而言,算法的时间复杂度是 \(O(1)\),空间复杂度也是 \(O(1)\)。推导已经把所有随 \(N\) 增长的循环都消掉了,剩下的只有少量整数运算和 bit count。

脚注与参考资料

  1. 题目页面:https://projecteuler.net/problem=561
  2. Primorial:Wikipedia — Primorial
  3. 约数函数:Wikipedia — Divisor function
  4. \(p\)-进赋值:Wikipedia — \(p\)-adic valuation
  5. Legendre 公式:Wikipedia — Legendre's formula

Краткое описание задачи

Пусть \(p_m\#=\prod_{i=1}^{m} p_i\) обозначает примориал первых \(m\) простых чисел, \(\tau(n)\) обозначает функцию числа делителей, а

$$S(N)=\sum_{d \mid N}\tau(d)-\tau(N),\qquad E(m,n)=v_2\!\left(S\!\left((p_m\#)^n\right)\right).$$

Требуется вычислить накопленную сумму

$$Q(m,N)=\sum_{n=1}^{N}E(m,n).$$

В реальном экземпляре задачи \(m=904961\) и \(N=10^{12}\). Поскольку это \(m\) нечётно, а \(N\) слишком велико для прямого перебора, решение обязано свести всё к закрытой формуле.

Математический подход

У степени примориала очень регулярная структура: в разложении участвуют ровно \(m\) различных простых, и каждый входит с одинаковой степенью \(n\). Именно эта симметрия позволяет превратить исходную сумму по делителям и \(2\)-адическую оценку в короткое вычисление.

Шаг 1: Развернуть выражение через делители для степени примориала

Для \(N=(p_m\#)^n\) каждая из \(m\) простых имеет показатель \(n\), поэтому

$$\tau\!\left((p_m\#)^n\right)=(n+1)^m.$$

Любой делитель получается независимым выбором показателя от \(0\) до \(n\) для каждого простого. Следовательно,

$$\sum_{d \mid (p_m\#)^n}\tau(d)=\left(\sum_{k=0}^{n}(k+1)\right)^m=\left(\frac{(n+1)(n+2)}{2}\right)^m.$$

Подстановка в определение \(S\) даёт точную формулу

$$S\!\left((p_m\#)^n\right)=\left(\frac{(n+1)(n+2)}{2}\right)^m-(n+1)^m.$$

Шаг 2: Рассмотреть нечётный \(n\)

Положим \(n=2k-1\). Тогда \(n+1=2k\), \(n+2=2k+1\), и потому

$$S\!\left((p_m\#)^{2k-1}\right)=\bigl(k(2k+1)\bigr)^m-(2k)^m=k^m\left((2k+1)^m-2^m\right).$$

Выражение в скобках нечётно, потому что нечётное число минус чётное остаётся нечётным. Значит, вся \(2\)-адическая оценка определяется только множителем \(k^m\):

$$E(m,2k-1)=m\,v_2(k)=m\,v_2\!\left(\frac{n+1}{2}\right).$$

Шаг 3: Рассмотреть чётный \(n\)

Положим теперь \(n=2r\). Тогда \(n+1=2r+1\) нечётно, и та же формула переписывается так:

$$S\!\left((p_m\#)^{2r}\right)=\bigl((2r+1)(r+1)\bigr)^m-(2r+1)^m=(2r+1)^m\left((r+1)^m-1\right).$$

Дальше всё зависит от остатка \(n\) по модулю \(4\).

Если \(r\) нечётно, то \(n\equiv 2 \pmod 4\), а \(r+1\) чётно. Тогда \((r+1)^m-1\) нечётно, и потому

$$E(m,n)=0 \qquad \text{if } n\equiv 2 \pmod 4.$$

Если же \(r=2t\), то \(n=4t\), а \(r+1=2t+1\) нечётно. Поскольку \(m=904961\) нечётно, имеем

$$\begin{aligned} (2t+1)^m-1&=(2t)\left((2t+1)^{m-1}+(2t+1)^{m-2}+\cdots+1\right). \end{aligned}$$

Сумма в скобках нечётна: это сумма нечётного числа нечётных слагаемых. Следовательно,

$$E(m,4t)=v_2(2t)=1+v_2(t)=v_2(n)-1.$$

Итак, для данного нечётного \(m\) получаем правило

$$E(m,n)= \begin{cases} m\,v_2\!\left(\frac{n+1}{2}\right), & n \text{ odd},\\ 0, & n\equiv 2 \pmod 4,\\ v_2(n)-1, & 4\mid n. \end{cases}$$

Шаг 4: Просуммировать вклад по классам

Теперь осталось вычислить

$$Q(m,N)=\sum_{n=1}^{N}E(m,n).$$

Класс \(n\equiv 2 \pmod 4\) даёт нулевой вклад, поэтому нужно суммировать только по нечётным \(n\) и по кратным \(4\).

Для нечётных \(n\) пишем \(n=2k-1\) и вводим

$$K=\left\lfloor\frac{N+1}{2}\right\rfloor.$$

Тогда

$$\sum_{\substack{1\le n\le N\\ n\text{ odd}}}E(m,n)=m\sum_{k=1}^{K}v_2(k)=m\,v_2(K!).$$

Для кратных \(4\) пишем \(n=4t\) и вводим

$$T=\left\lfloor\frac{N}{4}\right\rfloor.$$

После этого получаем

$$\sum_{\substack{1\le n\le N\\ 4\mid n}}E(m,n)=\sum_{t=1}^{T}\bigl(1+v_2(t)\bigr)=T+v_2(T!).$$

Значит, всё выражение сводится к формуле

$$Q(m,N)=m\,v_2(K!)+T+v_2(T!).$$

Шаг 5: Заменить оценки факториалов формулой Лежандра

Для простого \(2\) формула Лежандра имеет вид

$$v_2(x!)=\sum_{j\ge 1}\left\lfloor\frac{x}{2^j}\right\rfloor=x-\operatorname{popcount}(x).$$

Здесь \(\operatorname{popcount}(x)\) означает число единиц в двоичной записи \(x\). После подстановки финальная формула становится совсем короткой:

$$Q(m,N)=m\left(K-\operatorname{popcount}(K)\right)+T+\left(T-\operatorname{popcount}(T)\right).$$

Таким образом, в решении не остаётся ни одного цикла длины \(N\).

Разобранный пример: \(N=8\)

Этот контрольный пример достаточно мал для ручной проверки и одновременно полностью отражает общий метод. Здесь

$$K=\left\lfloor\frac{8+1}{2}\right\rfloor=4,\qquad T=\left\lfloor\frac{8}{4}\right\rfloor=2.$$

По формуле Лежандра

$$v_2(4!)=4-\operatorname{popcount}(4)=4-1=3,\qquad v_2(2!)=2-\operatorname{popcount}(2)=2-1=1.$$

Следовательно,

$$Q(m,8)=3m+3.$$

Для реального параметра \(m=904961\) отсюда сразу получается

$$Q(904961,8)=3\cdot 904961+3=2714886,$$

что в точности совпадает с контрольным значением в реализациях.

Как работает код

Реализации на C++, Python и Java не перебирают все \(n\) от \(1\) до \(N\). Вместо этого они напрямую применяют выведенную выше закрытую формулу к нечётному параметру \(m=904961\).

Сначала вычисляются

$$K=\left\lfloor\frac{N+1}{2}\right\rfloor,\qquad T=\left\lfloor\frac{N}{4}\right\rfloor,$$

затем по тождеству \(x-\operatorname{popcount}(x)\) находятся \(v_2(K!)\) и \(v_2(T!)\), после чего собирается выражение

$$m\,v_2(K!)+T+v_2(T!).$$

В варианте на C++ дополнительно есть две маленькие проверки: одна подтверждает, что \(S(6)=5\), а другая подтверждает контрольную сумму \(Q(904961,8)=2714886\). Затем программа печатает точный десятичный ответ для \(N=10^{12}\).

Анализ сложности

Для входов фиксированного машинного размера алгоритм работает за \(O(1)\) времени и использует \(O(1)\) памяти. Все зависимости от величины \(N\) устранены на уровне формул; остаётся лишь несколько целочисленных делений, подсчётов битов и сложений.

Примечания и ссылки

  1. Страница задачи: https://projecteuler.net/problem=561
  2. Примориал: Wikipedia — Primorial
  3. Функция числа делителей: Wikipedia — Divisor function
  4. \(p\)-адическая оценка: Wikipedia — \(p\)-adic valuation
  5. Формула Лежандра: Wikipedia — Legendre's formula

ملخص المسألة

ليكن \(p_m\#=\prod_{i=1}^{m} p_i\) هو primorial الخاص بأول \(m\) من الأعداد الأولية، ولتكن \(\tau(n)\) دالة عدد القواسم، ولنعرّف

$$S(N)=\sum_{d \mid N}\tau(d)-\tau(N),\qquad E(m,n)=v_2\!\left(S\!\left((p_m\#)^n\right)\right).$$

والكمية المطلوبة هي المجموع التراكمي

$$Q(m,N)=\sum_{n=1}^{N}E(m,n).$$

في مسألة Project Euler نفسها نأخذ \(m=904961\) و\(N=10^{12}\). وبما أنّ هذا \(m\) فردي وأن \(N\) ضخم جدًا، فلا يمكن الحساب حدًا حدًا، بل يجب اشتقاق صيغة مغلقة مباشرة.

المنهج الرياضي

قوة الـ primorial تمتلك بنية منتظمة جدًا: يوجد بالضبط \(m\) عوامل أولية مختلفة، وكل واحد منها يظهر بالأس نفسه \(n\). هذه المنتظمة هي التي تجعل مجموع القواسم والتقييم \(2\)-الأدّي ينهاران إلى حسابات بسيطة.

الخطوة 1: توسيع تعبير القواسم على قوة primorial

عندما يكون \(N=(p_m\#)^n\)، فإن كل واحد من العوامل الأولية \(m\) له الأس \(n\)، ولذلك

$$\tau\!\left((p_m\#)^n\right)=(n+1)^m.$$

وكل قاسم ينتج من اختيار أس بين \(0\) و\(n\) لكل عامل أولي بشكل مستقل. إذًا

$$\sum_{d \mid (p_m\#)^n}\tau(d)=\left(\sum_{k=0}^{n}(k+1)\right)^m=\left(\frac{(n+1)(n+2)}{2}\right)^m.$$

وبالتعويض في تعريف \(S\) نحصل على

$$S\!\left((p_m\#)^n\right)=\left(\frac{(n+1)(n+2)}{2}\right)^m-(n+1)^m.$$

الخطوة 2: معالجة الحالة التي يكون فيها \(n\) فرديًا

اكتب \(n=2k-1\). عندها \(n+1=2k\) و\(n+2=2k+1\)، ومن ثم

$$S\!\left((p_m\#)^{2k-1}\right)=\bigl(k(2k+1)\bigr)^m-(2k)^m=k^m\left((2k+1)^m-2^m\right).$$

العامل بين القوسين فردي، لأن عددًا فرديًا ناقص عدد زوجي يبقى فرديًا. لذلك فإن كل التقييم \(2\)-الأدّي يأتي فقط من \(k^m\):

$$E(m,2k-1)=m\,v_2(k)=m\,v_2\!\left(\frac{n+1}{2}\right).$$

الخطوة 3: معالجة الحالة التي يكون فيها \(n\) زوجيًا

اكتب \(n=2r\). عندها يكون \(n+1=2r+1\) عددًا فرديًا، وتصبح الصيغة نفسها

$$S\!\left((p_m\#)^{2r}\right)=\bigl((2r+1)(r+1)\bigr)^m-(2r+1)^m=(2r+1)^m\left((r+1)^m-1\right).$$

وهنا تتحدد النتيجة بحسب باقي \(n\) modulo \(4\).

إذا كان \(r\) فرديًا، فلدينا \(n\equiv 2 \pmod 4\)، وعندها يكون \(r+1\) زوجيًا، وبالتالي \((r+1)^m-1\) عددًا فرديًا. لذلك

$$E(m,n)=0 \qquad \text{if } n\equiv 2 \pmod 4.$$

أما إذا كان \(r=2t\)، فحينئذ \(n=4t\) و\(r+1=2t+1\) فردي. وبما أن \(m=904961\) فردي أيضًا، يمكن كتابة

$$\begin{aligned} (2t+1)^m-1&=(2t)\left((2t+1)^{m-1}+(2t+1)^{m-2}+\cdots+1\right). \end{aligned}$$

المجموع داخل القوس فردي لأنه مجموع عدد فردي من الحدود الفردية. ومن ثم

$$E(m,4t)=v_2(2t)=1+v_2(t)=v_2(n)-1.$$

وبجمع الحالات الثلاث نحصل، لهذا \(m\) الفردي، على القاعدة

$$E(m,n)= \begin{cases} m\,v_2\!\left(\frac{n+1}{2}\right), & n \text{ odd},\\ 0, & n\equiv 2 \pmod 4,\\ v_2(n)-1, & 4\mid n. \end{cases}$$

الخطوة 4: جمع الإسهامات حسب الفئات

الآن نريد حساب

$$Q(m,N)=\sum_{n=1}^{N}E(m,n).$$

الفئة \(n\equiv 2 \pmod 4\) لا تضيف شيئًا، لذا لا يبقى إلا الأعداد الفردية ومضاعفات \(4\).

للأعداد الفردية نكتب \(n=2k-1\)، ونأخذ

$$K=\left\lfloor\frac{N+1}{2}\right\rfloor.$$

وعندها

$$\sum_{\substack{1\le n\le N\\ n\text{ odd}}}E(m,n)=m\sum_{k=1}^{K}v_2(k)=m\,v_2(K!).$$

ولمضاعفات \(4\) نكتب \(n=4t\)، ونأخذ

$$T=\left\lfloor\frac{N}{4}\right\rfloor.$$

فنحصل على

$$\sum_{\substack{1\le n\le N\\ 4\mid n}}E(m,n)=\sum_{t=1}^{T}\bigl(1+v_2(t)\bigr)=T+v_2(T!).$$

إذًا تختزل المسألة كلها إلى

$$Q(m,N)=m\,v_2(K!)+T+v_2(T!).$$

الخطوة 5: استبدال تقييمات المضروب بصيغة Legendre

صيغة Legendre للعدد الأولي \(2\) تقول

$$v_2(x!)=\sum_{j\ge 1}\left\lfloor\frac{x}{2^j}\right\rfloor=x-\operatorname{popcount}(x).$$

وهنا \(\operatorname{popcount}(x)\) هو عدد الواحدات في التمثيل الثنائي لـ \(x\). بالتعويض نحصل على الصيغة النهائية المباشرة

$$Q(m,N)=m\left(K-\operatorname{popcount}(K)\right)+T+\left(T-\operatorname{popcount}(T)\right).$$

وبذلك تختفي تمامًا أي دورة تمتد حتى \(N\).

مثال محلول: \(N=8\)

هذا المثال صغير بما يكفي للتحقق اليدوي، وفي الوقت نفسه يوضح الآلية كاملة. لدينا

$$K=\left\lfloor\frac{8+1}{2}\right\rfloor=4,\qquad T=\left\lfloor\frac{8}{4}\right\rfloor=2.$$

وباستخدام Legendre،

$$v_2(4!)=4-\operatorname{popcount}(4)=4-1=3,\qquad v_2(2!)=2-\operatorname{popcount}(2)=2-1=1.$$

إذن

$$Q(m,8)=3m+3.$$

وبالنسبة إلى معامل المسألة الفعلي \(m=904961\)، نحصل على

$$Q(904961,8)=3\cdot 904961+3=2714886,$$

وهو بالضبط نفس مقدار التحقق الموجود في التنفيذات.

كيف تعمل الشيفرة

تنفيذات C++ وPython وJava لا تسير على كل \(n\) من \(1\) إلى \(N\). بدلًا من ذلك، تطبّق مباشرة الصيغة المغلقة السابقة على القيمة الفردية \(m=904961\).

تحسب كل نسخة أولًا

$$K=\left\lfloor\frac{N+1}{2}\right\rfloor,\qquad T=\left\lfloor\frac{N}{4}\right\rfloor,$$

ثم تحسب \(v_2(K!)\) و\(v_2(T!)\) عبر الهوية \(x-\operatorname{popcount}(x)\)، وبعد ذلك تكوّن

$$m\,v_2(K!)+T+v_2(T!).$$

كما أن نسخة C++ تتضمن تحققين صغيرين: أحدهما يثبت أن \(S(6)=5\)، والآخر يثبت نقطة الفحص \(Q(904961,8)=2714886\). وبعد ذلك تُطبع الإجابة العشرية الدقيقة عند \(N=10^{12}\).

تحليل التعقيد

بالنسبة إلى المدخلات ذات الحجم الثابت المستخدمة هنا، تعمل الخوارزمية بزمن \(O(1)\) وذاكرة \(O(1)\). الاشتقاق أزال كل حلقة تعتمد على \(N\)، ولم يبق إلا عدد قليل من عمليات القسمة الصحيحة، وعدّ البتات، والجمع.

الحواشي والمراجع

  1. صفحة المسألة: https://projecteuler.net/problem=561
  2. Primorial: Wikipedia — Primorial
  3. دالة القواسم: Wikipedia — Divisor function
  4. التقييم \(p\)-الأدّي: Wikipedia — \(p\)-adic valuation
  5. صيغة Legendre: Wikipedia — Legendre's formula