For each pair \((n,k)\) with \(1 \le k \le n\), the circle-of-coins problem has a counting function \(F(n,k)\) for the admissible binary coin configurations associated with that pair. The overall task is to evaluate
$$S(N)=\sum_{n=1}^{N}\sum_{k=1}^{n} F(n,k)\pmod{10^9+7}.$$
The key point in the implementations is that the combinatorics collapse to arithmetic data: only \(\gcd(n,k)\), the exponent of \(2\) dividing \(n\) and \(k\), and a totient-based regrouping are needed. That removes any need to enumerate coin states directly.
The C++, Python, and Java implementations all use the same arithmetic decomposition. Once the fixed-pair formula is known, the remaining work is to reorganize the double sum so that equal contributions are collected together efficiently.
Let
$$g=\gcd(n,k),$$
and let \(v_2(x)\) denote the exponent of \(2\) in \(x\). The implementations use the closed form
$$F(n,k)=\begin{cases} 2^{n-g+1}, & v_2(k)\le v_2(n),\\ 2^{n-g}, & v_2(k)>v_2(n). \end{cases}$$
So the entire dependence on the original circle is compressed into two quantities: the common divisor \(g\), which controls the main exponent \(n-g\), and a single parity-sensitive comparison of 2-adic valuations, which decides whether there is one extra factor of \(2\).
Write
$$n=t h,\qquad k=t r,\qquad t=\gcd(n,k),\qquad \gcd(r,h)=1.$$
Then \(t\) is exactly the gcd that appears in the fixed-pair formula, so
$$n-g=t h-t=t(h-1).$$
After removing the common factor \(t\), every pair \((n,k)\) is described by a reduced denominator \(h\) and a reduced residue \(r\) coprime to \(h\). The formula becomes
$$F(t h,t r)=\begin{cases} 2^{t(h-1)+1}, & v_2(r)\le v_2(h),\\ 2^{t(h-1)}, & v_2(r)>v_2(h). \end{cases}$$
This shows that, for fixed \(h\) and \(t\), all dependence on the reduced step is packed into how many coprime residues \(r\) satisfy the valuation test.
Now fix \(h \ge 2\) and sum over all \(r\) with \(1 \le r \le h\) and \(\gcd(r,h)=1\).
If \(h\) is even, every residue coprime to \(h\) must be odd. Hence \(v_2(r)=0\le v_2(h)\), so every reduced residue contributes the larger value \(2^{t(h-1)+1}\). Since there are \(\varphi(h)\) such residues, their total contribution is
$$\varphi(h)\cdot 2^{t(h-1)+1}=2\varphi(h)\,2^{t(h-1)}.$$
If \(h\) is odd, the reduced residues split evenly into odd and even values. Indeed, for every reduced residue \(r\), the paired residue \(h-r\) is also reduced and has opposite parity. Therefore exactly half of the \(\varphi(h)\) residues satisfy \(v_2(r)=0=v_2(h)\), while the other half fail the inequality.
From the parity split above, the total contribution for one fixed \(h \ge 2\) and one fixed \(t\) is
$$c(h)\,2^{t(h-1)},$$
where
$$c(h)=\begin{cases} 2\varphi(h), & h \text{ even},\\ \dfrac{3\varphi(h)}{2}, & h \text{ odd}. \end{cases}$$
The odd case is just
$$\frac{\varphi(h)}{2}\cdot 2^{t(h-1)+1}+\frac{\varphi(h)}{2}\cdot 2^{t(h-1)} =\frac{3\varphi(h)}{2}\,2^{t(h-1)}.$$
This is the crucial compression step: once pairs are grouped by \(h\), all the messy dependence on \(k\) is replaced by a single totient-based coefficient.
The case \(h=1\) is special. Then \(k=n\), so \(g=n\) and the fixed-pair formula gives \(F(n,n)=2\). Summed over \(n=1,\dots,N\), this contributes
$$2N.$$
For every \(h \ge 2\), the remaining parameter is \(t\), and the condition \(n=t h \le N\) means
$$1\le t\le \left\lfloor\frac{N}{h}\right\rfloor.$$
Therefore the full sum becomes
$$\boxed{S(N)=2N+\sum_{h=2}^{N} c(h)\sum_{t=1}^{\lfloor N/h\rfloor} 2^{t(h-1)} \pmod{10^9+7}.}$$
Mathematically the inner sum is a finite geometric progression, but the implementations simply step through its exponents directly after precomputing powers of \(2\).
The special term is
$$2N=6.$$
For \(h=2\), we have \(\varphi(2)=1\) and \(c(2)=2\). Also \(\lfloor 3/2\rfloor=1\), so this block contributes
$$2\cdot 2^{1}=4.$$
For \(h=3\), we have \(\varphi(3)=2\) and \(c(3)=3\). Also \(\lfloor 3/3\rfloor=1\), so this block contributes
$$3\cdot 2^{2}=12.$$
Hence
$$S(3)=6+4+12=22,$$
which matches the checkpoint used by the implementation. A single-pair checkpoint is \(F(9,3)=2^{9-3+1}=128\), because \(\gcd(9,3)=3\) and \(v_2(3)\le v_2(9)\).
The implementations first build Euler's totient values for all integers up to \(N\) with a linear sieve. They also precompute the table
$$2^0,2^1,\dots,2^N \pmod{10^9+7},$$
so every power lookup in the main sum is constant time.
After that, the algorithm starts with the special contribution \(2N\). It then iterates through \(h=2,3,\dots,N\), computes the coefficient \(c(h)\) from the parity of \(h\) and the totient value, and adds
$$c(h)\,2^{t(h-1)}$$
for each \(t=1,\dots,\lfloor N/h\rfloor\). All arithmetic is reduced modulo \(10^9+7\) after each addition. The C++, Python, and Java implementations follow exactly the same mathematical plan; the C++ version also includes small checkpoint assertions before producing the final large-input result.
The totient sieve runs in \(O(N)\) time and uses \(O(N)\) memory. The double summation over blocks costs
$$\sum_{h=2}^{N}\left\lfloor\frac{N}{h}\right\rfloor=O(N\log N).$$
Therefore the total running time is \(O(N\log N)\), while the memory usage remains \(O(N)\).
Für jedes Paar \((n,k)\) mit \(1 \le k \le n\) besitzt das Kreis-mit-Münzen-Problem eine Zählfunktion \(F(n,k)\) für die zulässigen binären Münzkonfigurationen. Gesucht ist insgesamt
$$S(N)=\sum_{n=1}^{N}\sum_{k=1}^{n} F(n,k)\pmod{10^9+7}.$$
Der entscheidende Punkt ist, dass die Implementierungen keine Konfigurationen direkt auflisten. Stattdessen hängt alles nur von \(\gcd(n,k)\), vom Vergleich der 2-adischen Bewertungen von \(n\) und \(k\) und von einer Gruppierung über die Eulersche Phi-Funktion ab.
Alle drei Implementierungen verwenden dieselbe arithmetische Zerlegung. Sobald die Formel für ein festes Paar \((n,k)\) bekannt ist, wird die Doppelsumme so umgeordnet, dass gleiche Beiträge blockweise zusammengefasst werden.
Sei
$$g=\gcd(n,k),$$
und sei \(v_2(x)\) der Exponent von \(2\) in \(x\). Dann gilt in den Implementierungen
$$F(n,k)=\begin{cases} 2^{n-g+1}, & v_2(k)\le v_2(n),\\ 2^{n-g}, & v_2(k)>v_2(n). \end{cases}$$
Die ganze Kombinatorik des Kreises wird also auf zwei Größen reduziert: den gemeinsamen Teiler \(g\), der den Hauptexponenten \(n-g\) bestimmt, und einen einzigen Paritätsvergleich, der entscheidet, ob noch ein zusätzlicher Faktor \(2\) dazukommt.
Schreibe
$$n=t h,\qquad k=t r,\qquad t=\gcd(n,k),\qquad \gcd(r,h)=1.$$
Dann ist \(t\) genau der ggT aus der Formel, also
$$n-g=t h-t=t(h-1).$$
Nach Herausziehen des gemeinsamen Faktors wird jedes Paar \((n,k)\) durch einen reduzierten Nenner \(h\) und eine zu \(h\) teilerfremde Restklasse \(r\) beschrieben. Damit wird
$$F(t h,t r)=\begin{cases} 2^{t(h-1)+1}, & v_2(r)\le v_2(h),\\ 2^{t(h-1)}, & v_2(r)>v_2(h). \end{cases}$$
Für feste \(h\) und \(t\) muss man also nur noch zählen, wie viele reduzierte Restklassen \(r\) die Bewertungsbedingung erfüllen.
Fixiere nun \(h \ge 2\) und summiere über alle \(r\) mit \(1 \le r \le h\) und \(\gcd(r,h)=1\).
Ist \(h\) gerade, dann ist jede zu \(h\) teilerfremde Zahl automatisch ungerade. Also gilt \(v_2(r)=0\le v_2(h)\), und jede reduzierte Restklasse liefert den größeren Wert \(2^{t(h-1)+1}\). Da es \(\varphi(h)\) solcher Restklassen gibt, ist der Gesamtbeitrag
$$\varphi(h)\cdot 2^{t(h-1)+1}=2\varphi(h)\,2^{t(h-1)}.$$
Ist \(h\) ungerade, dann zerfallen die reduzierten Restklassen zu gleichen Hälften in gerade und ungerade Werte. Denn zu jeder reduzierten Restklasse \(r\) gehört auch \(h-r\), ebenfalls reduziert, aber mit entgegengesetzter Parität. Genau die ungeraden Klassen erfüllen dann \(v_2(r)=0=v_2(h)\).
Aus dieser Paritätsaufspaltung folgt für ein festes \(h \ge 2\) und ein festes \(t\) der Beitrag
$$c(h)\,2^{t(h-1)},$$
wobei
$$c(h)=\begin{cases} 2\varphi(h), & h \text{ gerade},\\ \dfrac{3\varphi(h)}{2}, & h \text{ ungerade}. \end{cases}$$
Im ungeraden Fall ist das einfach
$$\frac{\varphi(h)}{2}\cdot 2^{t(h-1)+1}+\frac{\varphi(h)}{2}\cdot 2^{t(h-1)} =\frac{3\varphi(h)}{2}\,2^{t(h-1)}.$$
Genau hier wird die Summe komprimiert: Die detaillierte Abhängigkeit von \(k\) verschwindet und wird durch einen einzigen, von \(\varphi(h)\) gesteuerten Blockfaktor ersetzt.
Der Fall \(h=1\) ist speziell. Dann gilt \(k=n\), also \(g=n\) und damit \(F(n,n)=2\). Über alle \(n=1,\dots,N\) summiert ergibt das
$$2N.$$
Für \(h \ge 2\) bleibt als freier Parameter nur \(t\), und aus \(n=t h \le N\) folgt
$$1\le t\le \left\lfloor\frac{N}{h}\right\rfloor.$$
Damit erhält man die Endformel
$$\boxed{S(N)=2N+\sum_{h=2}^{N} c(h)\sum_{t=1}^{\lfloor N/h\rfloor} 2^{t(h-1)} \pmod{10^9+7}.}$$
Mathematisch ist die innere Summe eine endliche geometrische Reihe; die Implementierungen laufen aber einfach über die Exponenten, nachdem alle Zweierpotenzen vorab berechnet wurden.
Der Spezialterm ist
$$2N=6.$$
Für \(h=2\) gilt \(\varphi(2)=1\) und \(c(2)=2\). Außerdem ist \(\lfloor 3/2\rfloor=1\), also trägt dieser Block
$$2\cdot 2^{1}=4$$
bei. Für \(h=3\) gilt \(\varphi(3)=2\) und \(c(3)=3\). Wegen \(\lfloor 3/3\rfloor=1\) ist der Beitrag
$$3\cdot 2^{2}=12.$$
Somit
$$S(3)=6+4+12=22,$$
genau der Kontrollwert der Implementierung. Ein Einzelwert ist \(F(9,3)=2^{9-3+1}=128\), weil \(\gcd(9,3)=3\) und \(v_2(3)\le v_2(9)\).
Die Implementierungen erzeugen zuerst mit einem linearen Sieb die Phi-Werte für alle Zahlen bis \(N\). Außerdem wird die Tabelle
$$2^0,2^1,\dots,2^N \pmod{10^9+7}$$
vorab berechnet, sodass jede Potenz im Hauptteil in konstanter Zeit verfügbar ist.
Danach startet der Algorithmus mit dem Spezialbeitrag \(2N\). Anschließend läuft er \(h=2,3,\dots,N\) durch, bestimmt den Koeffizienten \(c(h)\) aus Parität und Phi-Wert und addiert
$$c(h)\,2^{t(h-1)}$$
für jedes \(t=1,\dots,\lfloor N/h\rfloor\). Nach jeder Addition wird modulo \(10^9+7\) reduziert. Die C++-, Python- und Java-Implementierungen folgen exakt demselben Plan; die C++-Variante enthält zusätzlich einige kleine Kontrolltests.
Das lineare Phi-Sieb benötigt \(O(N)\) Zeit und \(O(N)\) Speicher. Die Blocksumme kostet
$$\sum_{h=2}^{N}\left\lfloor\frac{N}{h}\right\rfloor=O(N\log N).$$
Insgesamt liegt die Laufzeit also bei \(O(N\log N)\), der Speicherverbrauch bei \(O(N)\).
Her \((n,k)\) çifti için, \(1 \le k \le n\) koşulu altında, çember üzerindeki geçerli ikili para dizilimlerinin sayısını veren bir \(F(n,k)\) fonksiyonu vardır. İstenen toplam
$$S(N)=\sum_{n=1}^{N}\sum_{k=1}^{n} F(n,k)\pmod{10^9+7}$$
şeklindedir. Uygulamalar bu toplamı doğrudan para dizilimlerini tarayarak değil; \(\gcd(n,k)\), \(n\) ile \(k\)'nın 2-adik değerleri ve Euler phi fonksiyonu üzerinden kurulan blok ayrımıyla hesaplar.
C++, Python ve Java uygulamalarının üçü de aynı aritmetik parçalamayı kullanır. Sabit bir \((n,k)\) çifti için kapalı form elde edildikten sonra, esas iş bu çift toplamı daha büyük bloklar halinde yeniden düzenlemektir.
$$g=\gcd(n,k)$$
olsun ve \(v_2(x)\), \(x\) sayısındaki \(2\) kuvvetinin üssünü göstersin. Uygulamalarda kullanılan formül şudur:
$$F(n,k)=\begin{cases} 2^{n-g+1}, & v_2(k)\le v_2(n),\\ 2^{n-g}, & v_2(k)>v_2(n). \end{cases}$$
Yani çemberdeki kombinatorik yapı iki aritmetik özete indirgenir: ana üs \(n-g\)'yi belirleyen ortak bölen \(g\) ve bir ek \(2\) çarpanı olup olmayacağını belirleyen 2-adik karşılaştırma.
Şöyle yazalım:
$$n=t h,\qquad k=t r,\qquad t=\gcd(n,k),\qquad \gcd(r,h)=1.$$
Böylece formüldeki ortak bölen doğrudan \(t\) olur ve
$$n-g=t h-t=t(h-1)$$
elde edilir. Ortak çarpan çıkarılınca her çift, \(h\) adlı indirgenmiş payda ve \(h\) ile aralarında asal olan \(r\) artık sınıfı ile temsil edilir. Bu durumda
$$F(t h,t r)=\begin{cases} 2^{t(h-1)+1}, & v_2(r)\le v_2(h),\\ 2^{t(h-1)}, & v_2(r)>v_2(h). \end{cases}$$
Demek ki sabit \(h\) ve \(t\) için asıl soru, bu değerleme testini geçen indirgenmiş \(r\) sayısını bulmaktır.
Şimdi \(h \ge 2\) sabit olsun ve \(\gcd(r,h)=1\) koşulunu sağlayan tüm \(1 \le r \le h\) değerleri üzerinden toplayalım.
Eğer \(h\) çiftse, \(h\) ile aralarında asal her sayı zorunlu olarak tektir. O halde \(v_2(r)=0\le v_2(h)\) olur ve bütün indirgenmiş sınıflar daha büyük değer olan \(2^{t(h-1)+1}\) katkısını verir. Bu sınıfların sayısı \(\varphi(h)\) olduğundan toplam katkı
$$\varphi(h)\cdot 2^{t(h-1)+1}=2\varphi(h)\,2^{t(h-1)}$$
olur. Eğer \(h\) tekse, indirgenmiş sınıflar tek ve çift olarak tam ortadan bölünür. Çünkü her \(r\) için \(h-r\) de yine indirgenmiştir ve zıt parity'ye sahiptir. Böylece sınıfların yarısı eşitsizliği sağlar, yarısı sağlamaz.
Bu nedenle sabit bir \(h \ge 2\) ve sabit bir \(t\) için toplam katkı
$$c(h)\,2^{t(h-1)}$$
şeklindedir; burada
$$c(h)=\begin{cases} 2\varphi(h), & h \text{ çift},\\ \dfrac{3\varphi(h)}{2}, & h \text{ tek}. \end{cases}$$
Tek \(h\) durumunda bu sonuç
$$\frac{\varphi(h)}{2}\cdot 2^{t(h-1)+1}+\frac{\varphi(h)}{2}\cdot 2^{t(h-1)} =\frac{3\varphi(h)}{2}\,2^{t(h-1)}$$
eşitliğinden gelir. Kritik sıkıştırma tam burada olur: \(k\)'ya dair ayrıntılı bağımlılık, yalnızca \(\varphi(h)\) ile belirlenen tek bir katsayıya indirgenir.
\(h=1\) durumu özeldir. Bu durumda \(k=n\), dolayısıyla \(g=n\) ve
$$F(n,n)=2$$
olur. Tüm \(n=1,\dots,N\) için bunun toplamı
$$2N$$
verir. \(h \ge 2\) için geriye kalan serbest parametre \(t\)'dir ve \(n=t h \le N\) koşulu
$$1\le t\le \left\lfloor\frac{N}{h}\right\rfloor$$
anlamına gelir. Böylece nihai formül
$$\boxed{S(N)=2N+\sum_{h=2}^{N} c(h)\sum_{t=1}^{\lfloor N/h\rfloor} 2^{t(h-1)} \pmod{10^9+7}.}$$
Matematiksel olarak iç toplam sonlu bir geometrik seridir; fakat uygulamalar, \(2\)'nin kuvvetleri önceden hesaplandıktan sonra bu üsleri doğrudan dolaşır.
Özel katkı
$$2N=6$$
olur. \(h=2\) için \(\varphi(2)=1\) ve \(c(2)=2\) olduğundan, \(\lfloor 3/2\rfloor=1\) ile birlikte bu blok
$$2\cdot 2^{1}=4$$
katkı verir. \(h=3\) için \(\varphi(3)=2\) ve \(c(3)=3\) olduğundan katkı
$$3\cdot 2^{2}=12$$
olur. Sonuç olarak
$$S(3)=6+4+12=22,$$
ki bu, uygulamanın kontrol değeridir. Tek bir çift için kontrol etmek istersek, \(\gcd(9,3)=3\) ve \(v_2(3)\le v_2(9)\) olduğundan \(F(9,3)=2^{9-3+1}=128\) elde edilir.
Uygulamalar önce \(1\) ile \(N\) arasındaki tüm sayılar için Euler phi değerlerini lineer elek ile üretir. Ardından
$$2^0,2^1,\dots,2^N \pmod{10^9+7}$$
tablosu hazırlanır; böylece ana toplam içindeki her üs değeri sabit zamanda okunabilir.
Daha sonra algoritma \(2N\) özel katkısıyla başlar. Sonrasında \(h=2,3,\dots,N\) için sırayla ilerler, \(h\)'nın tek-çift durumundan ve phi değerinden \(c(h)\) katsayısını çıkarır ve
$$c(h)\,2^{t(h-1)}$$
terimlerini \(t=1,\dots,\lfloor N/h\rfloor\) boyunca toplar. Her eklemeden sonra mod \(10^9+7\) uygulanır. C++, Python ve Java uygulamaları aynı matematiksel yapıyı izler; C++ sürümünde ayrıca küçük kontrol doğrulamaları da vardır.
Phi eleği \(O(N)\) zamanda çalışır ve \(O(N)\) bellek kullanır. Blok toplamının maliyeti
$$\sum_{h=2}^{N}\left\lfloor\frac{N}{h}\right\rfloor=O(N\log N)$$
olduğundan toplam süre \(O(N\log N)\), toplam bellek ise \(O(N)\) olur.
Para cada par \((n,k)\) con \(1 \le k \le n\), el problema del círculo de monedas tiene una función de conteo \(F(n,k)\) que da el número de configuraciones binarias admisibles asociadas a ese par. La cantidad total que se busca es
$$S(N)=\sum_{n=1}^{N}\sum_{k=1}^{n} F(n,k)\pmod{10^9+7}.$$
La observación clave es que no hace falta enumerar estados de monedas. Las implementaciones reducen todo a \(\gcd(n,k)\), a una comparación entre valuaciones 2-ádicas y a una reagrupación basada en \(\varphi(h)\).
Las implementaciones en C++, Python y Java siguen exactamente la misma descomposición aritmética. Una vez conocida la fórmula para un par fijo \((n,k)\), la doble suma se reorganiza por bloques con la misma estructura.
Sea
$$g=\gcd(n,k),$$
y sea \(v_2(x)\) el exponente de \(2\) en \(x\). La fórmula utilizada es
$$F(n,k)=\begin{cases} 2^{n-g+1}, & v_2(k)\le v_2(n),\\ 2^{n-g}, & v_2(k)>v_2(n). \end{cases}$$
Así, toda la parte combinatoria del círculo queda comprimida en dos datos: el divisor común \(g\), que fija el exponente principal \(n-g\), y una comparación de paridad 2-ádica que decide si aparece un factor adicional de \(2\).
Escribimos
$$n=t h,\qquad k=t r,\qquad t=\gcd(n,k),\qquad \gcd(r,h)=1.$$
Entonces \(t\) es exactamente el mcd de la fórmula, y por tanto
$$n-g=t h-t=t(h-1).$$
Después de extraer el factor común, cada par queda descrito por un denominador reducido \(h\) y un residuo reducido \(r\) coprimo con \(h\). La expresión pasa a ser
$$F(t h,t r)=\begin{cases} 2^{t(h-1)+1}, & v_2(r)\le v_2(h),\\ 2^{t(h-1)}, & v_2(r)>v_2(h). \end{cases}$$
Para \(h\) y \(t\) fijos, el problema se convierte en contar cuántos residuos reducidos satisfacen la desigualdad de valuaciones.
Fijemos \(h \ge 2\) y sumemos sobre todos los \(r\) con \(1 \le r \le h\) y \(\gcd(r,h)=1\).
Si \(h\) es par, todo número coprimo con \(h\) debe ser impar. Entonces \(v_2(r)=0\le v_2(h)\), de modo que todos los residuos reducidos aportan el valor grande \(2^{t(h-1)+1}\). Como hay \(\varphi(h)\) residuos de este tipo, la contribución total es
$$\varphi(h)\cdot 2^{t(h-1)+1}=2\varphi(h)\,2^{t(h-1)}.$$
Si \(h\) es impar, los residuos reducidos se dividen por igual entre impares y pares. En efecto, si \(r\) es reducido, entonces \(h-r\) también lo es y tiene paridad opuesta. Por eso, exactamente la mitad satisface \(v_2(r)=0=v_2(h)\) y la otra mitad no.
De esta separación sale que, para un \(h \ge 2\) fijo y un \(t\) fijo, la contribución conjunta es
$$c(h)\,2^{t(h-1)},$$
donde
$$c(h)=\begin{cases} 2\varphi(h), & h \text{ es par},\\ \dfrac{3\varphi(h)}{2}, & h \text{ es impar}. \end{cases}$$
En el caso impar, simplemente
$$\frac{\varphi(h)}{2}\cdot 2^{t(h-1)+1}+\frac{\varphi(h)}{2}\cdot 2^{t(h-1)} =\frac{3\varphi(h)}{2}\,2^{t(h-1)}.$$
Éste es el paso decisivo: toda la dependencia detallada respecto de \(k\) queda absorbida por un solo coeficiente gobernado por la función totiente.
El caso \(h=1\) es especial. Allí se tiene \(k=n\), luego \(g=n\) y
$$F(n,n)=2.$$
Al sumar esto para \(n=1,\dots,N\), aparece el término
$$2N.$$
Para \(h \ge 2\), el parámetro libre es \(t\), y la condición \(n=t h \le N\) equivale a
$$1\le t\le \left\lfloor\frac{N}{h}\right\rfloor.$$
Así obtenemos
$$\boxed{S(N)=2N+\sum_{h=2}^{N} c(h)\sum_{t=1}^{\lfloor N/h\rfloor} 2^{t(h-1)} \pmod{10^9+7}.}$$
Desde el punto de vista matemático, la suma interior es una progresión geométrica finita; en la práctica, las implementaciones recorren directamente los exponentes después de precalcular las potencias de \(2\).
El término especial vale
$$2N=6.$$
Para \(h=2\), \(\varphi(2)=1\) y \(c(2)=2\). Como \(\lfloor 3/2\rfloor=1\), este bloque aporta
$$2\cdot 2^{1}=4.$$
Para \(h=3\), \(\varphi(3)=2\) y \(c(3)=3\). Como \(\lfloor 3/3\rfloor=1\), el aporte es
$$3\cdot 2^{2}=12.$$
Por lo tanto,
$$S(3)=6+4+12=22,$$
que coincide con el valor de comprobación de la implementación. También puede verificarse el caso individual \(F(9,3)=2^{9-3+1}=128\), porque \(\gcd(9,3)=3\) y \(v_2(3)\le v_2(9)\).
Las implementaciones construyen primero los valores de la función totiente de Euler hasta \(N\) mediante una criba lineal. Además, precalculan la tabla
$$2^0,2^1,\dots,2^N \pmod{10^9+7},$$
de modo que cada potencia necesaria en la suma principal se obtiene en tiempo constante.
Después, el algoritmo arranca con la contribución especial \(2N\). Luego recorre \(h=2,3,\dots,N\), calcula \(c(h)\) a partir de la paridad de \(h\) y de \(\varphi(h)\), y suma
$$c(h)\,2^{t(h-1)}$$
para cada \(t=1,\dots,\lfloor N/h\rfloor\). Todas las operaciones se reducen módulo \(10^9+7\). Las versiones en C++, Python y Java siguen exactamente el mismo plan; la de C++ añade además algunas comprobaciones pequeñas antes del cálculo final.
La criba para \(\varphi\) cuesta \(O(N)\) tiempo y \(O(N)\) memoria. La suma por bloques tiene coste
$$\sum_{h=2}^{N}\left\lfloor\frac{N}{h}\right\rfloor=O(N\log N).$$
En consecuencia, el tiempo total es \(O(N\log N)\) y la memoria total es \(O(N)\).
对每一对满足 \(1 \le k \le n\) 的 \((n,k)\),这个硬币圆环问题都会对应一个计数函数 \(F(n,k)\),表示该参数下可行的二元硬币状态数量。题目要求的是总和
$$S(N)=\sum_{n=1}^{N}\sum_{k=1}^{n} F(n,k)\pmod{10^9+7}.$$
实现的核心并不是枚举圆环上的所有状态,而是把问题压缩成纯算术问题:只需要 \(\gcd(n,k)\)、\(n\) 与 \(k\) 的 2-adic 赋值比较,以及一个按欧拉函数重组后的求和公式。
C++、Python 和 Java 三个实现都使用同一套分解思路。先得到固定 \((n,k)\) 的闭式公式,再把双重求和按共同结构重新分组,这样才有可能在大输入下计算。
记
$$g=\gcd(n,k),$$
并记 \(v_2(x)\) 为 \(x\) 中因子 \(2\) 的指数。实现使用的公式是
$$F(n,k)=\begin{cases} 2^{n-g+1}, & v_2(k)\le v_2(n),\\ 2^{n-g}, & v_2(k)>v_2(n). \end{cases}$$
这说明与圆环配置有关的复杂组合结构,最终只留下两条信息:一是最大公约数 \(g\),它决定主指数 \(n-g\);二是一个关于 2-adic 赋值的比较,它决定是否再多出一个因子 \(2\)。
写成
$$n=t h,\qquad k=t r,\qquad t=\gcd(n,k),\qquad \gcd(r,h)=1.$$
这里的 \(t\) 就是公式中的最大公约数,因此
$$n-g=t h-t=t(h-1).$$
把公共因子 \(t\) 提出来之后,每个原始参数对 \((n,k)\) 都可以改写成“一个既约分母 \(h\)”加上“一个与 \(h\) 互素的既约剩余类 \(r\)”。于是公式变成
$$F(t h,t r)=\begin{cases} 2^{t(h-1)+1}, & v_2(r)\le v_2(h),\\ 2^{t(h-1)}, & v_2(r)>v_2(h). \end{cases}$$
这样一来,在固定 \(h\) 和 \(t\) 时,问题只剩下一个计数任务:到底有多少个既约剩余类 \(r\) 满足赋值不等式。
现在固定 \(h \ge 2\),把所有满足 \(1 \le r \le h\) 且 \(\gcd(r,h)=1\) 的 \(r\) 全部加起来。
如果 \(h\) 是偶数,那么与 \(h\) 互素的数一定都是奇数,因此 \(v_2(r)=0\le v_2(h)\)。也就是说,所有既约剩余类都会贡献较大的那一项 \(2^{t(h-1)+1}\)。这样的 \(r\) 一共有 \(\varphi(h)\) 个,所以总贡献是
$$\varphi(h)\cdot 2^{t(h-1)+1}=2\varphi(h)\,2^{t(h-1)}.$$
如果 \(h\) 是奇数,那么既约剩余类在奇偶之间正好均分。原因很简单:若 \(r\) 与 \(h\) 互素,则 \(h-r\) 也与 \(h\) 互素,而且两者奇偶性相反。因此恰有一半满足 \(v_2(r)=0=v_2(h)\),另一半不满足该条件。
于是,对任意固定的 \(h \ge 2\) 和 \(t\),整块的贡献都可以写成
$$c(h)\,2^{t(h-1)},$$
其中
$$c(h)=\begin{cases} 2\varphi(h), & h \text{ 为偶数},\\ \dfrac{3\varphi(h)}{2}, & h \text{ 为奇数}. \end{cases}$$
奇数情形只是把两类贡献相加:
$$\frac{\varphi(h)}{2}\cdot 2^{t(h-1)+1}+\frac{\varphi(h)}{2}\cdot 2^{t(h-1)} =\frac{3\varphi(h)}{2}\,2^{t(h-1)}.$$
这一步最重要,因为它把原来对 \(k\) 的细粒度依赖压缩成一个只依赖 \(h\) 的系数,而这个系数完全可以用 \(\varphi(h)\) 表示。
\(h=1\) 需要单独处理。此时只能有 \(k=n\),所以 \(g=n\),从闭式公式立刻得到
$$F(n,n)=2.$$
对所有 \(n=1,\dots,N\) 求和,就得到特殊项
$$2N.$$
而当 \(h \ge 2\) 时,自由参数只剩 \(t\),并且 \(n=t h \le N\) 等价于
$$1\le t\le \left\lfloor\frac{N}{h}\right\rfloor.$$
因此总和可以改写为
$$\boxed{S(N)=2N+\sum_{h=2}^{N} c(h)\sum_{t=1}^{\lfloor N/h\rfloor} 2^{t(h-1)} \pmod{10^9+7}.}$$
从数学上看,内层和是一个有限等比数列;但实现并没有显式套用等比求和公式,而是在预处理好所有 \(2\) 的幂之后直接逐项累加。
先看特殊项:
$$2N=6.$$
当 \(h=2\) 时,\(\varphi(2)=1\),所以 \(c(2)=2\)。又因为 \(\lfloor 3/2\rfloor=1\),这一块的贡献是
$$2\cdot 2^{1}=4.$$
当 \(h=3\) 时,\(\varphi(3)=2\),所以 \(c(3)=3\)。同样因为 \(\lfloor 3/3\rfloor=1\),这一块的贡献是
$$3\cdot 2^{2}=12.$$
于是
$$S(3)=6+4+12=22,$$
这正好等于实现中的检查值。另一个单点检查是 \(F(9,3)=2^{9-3+1}=128\),因为 \(\gcd(9,3)=3\) 且 \(v_2(3)\le v_2(9)\)。
实现首先用线性筛构造出 \(1\) 到 \(N\) 的欧拉函数值。然后预计算
$$2^0,2^1,\dots,2^N \pmod{10^9+7},$$
这样主循环中需要的每个幂都可以直接查表。
之后,算法先加入特殊项 \(2N\)。再从 \(h=2\) 枚举到 \(N\),根据 \(h\) 的奇偶性和 \(\varphi(h)\) 得到系数 \(c(h)\),并把
$$c(h)\,2^{t(h-1)}$$
对所有 \(t=1,\dots,\lfloor N/h\rfloor\) 的值累加进去。每一步都对 \(10^9+7\) 取模。C++、Python 和 Java 三个实现的数学结构完全一致;其中 C++ 版本在最终大规模计算前还保留了几个小规模检查点。
欧拉函数线性筛的时间复杂度是 \(O(N)\),空间复杂度也是 \(O(N)\)。按块求和的代价为
$$\sum_{h=2}^{N}\left\lfloor\frac{N}{h}\right\rfloor=O(N\log N).$$
因此总时间复杂度为 \(O(N\log N)\),总空间复杂度为 \(O(N)\)。
Для каждой пары \((n,k)\), где \(1 \le k \le n\), задача о круге монет задаёт функцию \(F(n,k)\), равную числу допустимых бинарных конфигураций для этой пары параметров. Требуется вычислить сумму
$$S(N)=\sum_{n=1}^{N}\sum_{k=1}^{n} F(n,k)\pmod{10^9+7}.$$
Главная идея состоит в том, что прямой перебор конфигураций не нужен. Реализации сводят задачу к арифметике: используются только \(\gcd(n,k)\), сравнение 2-адических оценок и перегруппировка по функции Эйлера.
Реализации на C++, Python и Java используют одну и ту же схему. Сначала берётся замкнутая формула для фиксированной пары \((n,k)\), а затем двойная сумма перестраивается так, чтобы одинаковые вклады собирались блоками.
Пусть
$$g=\gcd(n,k),$$
а \(v_2(x)\) обозначает показатель степени двойки в \(x\). Тогда используется формула
$$F(n,k)=\begin{cases} 2^{n-g+1}, & v_2(k)\le v_2(n),\\ 2^{n-g}, & v_2(k)>v_2(n). \end{cases}$$
Вся комбинаторика круга сжимается до двух величин: общего делителя \(g\), задающего основной показатель \(n-g\), и одного сравнения 2-адических оценок, которое определяет, появляется ли дополнительный множитель \(2\).
Запишем
$$n=t h,\qquad k=t r,\qquad t=\gcd(n,k),\qquad \gcd(r,h)=1.$$
Тогда \(t\) и есть тот самый НОД, поэтому
$$n-g=t h-t=t(h-1).$$
После вынесения общего множителя каждая пара \((n,k)\) описывается приведённым знаменателем \(h\) и приведённым остатком \(r\), взаимно простым с \(h\). Формула принимает вид
$$F(t h,t r)=\begin{cases} 2^{t(h-1)+1}, & v_2(r)\le v_2(h),\\ 2^{t(h-1)}, & v_2(r)>v_2(h). \end{cases}$$
Значит, при фиксированных \(h\) и \(t\) нужно только посчитать, сколько приведённых остатков \(r\) проходит условие на оценку.
Зафиксируем \(h \ge 2\) и просуммируем по всем \(r\), для которых \(1 \le r \le h\) и \(\gcd(r,h)=1\).
Если \(h\) чётно, то любое число, взаимно простое с \(h\), обязано быть нечётным. Следовательно, \(v_2(r)=0\le v_2(h)\), и каждый приведённый остаток даёт больший вклад \(2^{t(h-1)+1}\). Таких остатков \(\varphi(h)\), поэтому суммарный вклад равен
$$\varphi(h)\cdot 2^{t(h-1)+1}=2\varphi(h)\,2^{t(h-1)}.$$
Если \(h\) нечётно, приведённые остатки поровну делятся на чётные и нечётные. Действительно, вместе с каждым \(r\) идёт число \(h-r\), тоже взаимно простое с \(h\), но противоположной чётности. Поэтому ровно половина остатков удовлетворяет условию \(v_2(r)=0=v_2(h)\), а другая половина нет.
Отсюда вклад для фиксированных \(h \ge 2\) и \(t\) можно записать как
$$c(h)\,2^{t(h-1)},$$
где
$$c(h)=\begin{cases} 2\varphi(h), & h \text{ чётно},\\ \dfrac{3\varphi(h)}{2}, & h \text{ нечётно}. \end{cases}$$
В нечётном случае это просто
$$\frac{\varphi(h)}{2}\cdot 2^{t(h-1)+1}+\frac{\varphi(h)}{2}\cdot 2^{t(h-1)} =\frac{3\varphi(h)}{2}\,2^{t(h-1)}.$$
Именно здесь происходит основное сжатие: подробная зависимость от \(k\) исчезает и заменяется одним коэффициентом, выраженным через \(\varphi(h)\).
Случай \(h=1\) обрабатывается отдельно. Тогда \(k=n\), следовательно \(g=n\) и
$$F(n,n)=2.$$
Суммирование по всем \(n=1,\dots,N\) даёт
$$2N.$$
Для \(h \ge 2\) свободным параметром остаётся \(t\), а условие \(n=t h \le N\) означает
$$1\le t\le \left\lfloor\frac{N}{h}\right\rfloor.$$
Итак, итоговая формула равна
$$\boxed{S(N)=2N+\sum_{h=2}^{N} c(h)\sum_{t=1}^{\lfloor N/h\rfloor} 2^{t(h-1)} \pmod{10^9+7}.}$$
С математической точки зрения внутренняя сумма является конечной геометрической прогрессией, но реализации просто проходят по нужным степеням после предварительного вычисления всех степеней двойки.
Специальный вклад равен
$$2N=6.$$
Для \(h=2\) имеем \(\varphi(2)=1\) и \(c(2)=2\). Так как \(\lfloor 3/2\rfloor=1\), этот блок даёт
$$2\cdot 2^{1}=4.$$
Для \(h=3\) имеем \(\varphi(3)=2\) и \(c(3)=3\). Так как \(\lfloor 3/3\rfloor=1\), вклад равен
$$3\cdot 2^{2}=12.$$
Следовательно,
$$S(3)=6+4+12=22,$$
что совпадает с проверочным значением в реализации. Ещё одна контрольная точка: \(F(9,3)=2^{9-3+1}=128\), поскольку \(\gcd(9,3)=3\) и \(v_2(3)\le v_2(9)\).
Сначала реализации строят значения функции Эйлера для всех чисел до \(N\) при помощи линейного решета. Затем предварительно вычисляется таблица
$$2^0,2^1,\dots,2^N \pmod{10^9+7},$$
чтобы любая степень двойки в основной сумме извлекалась за константное время.
После этого алгоритм добавляет специальный вклад \(2N\), затем перебирает \(h=2,3,\dots,N\), вычисляет коэффициент \(c(h)\) по чётности \(h\) и значению \(\varphi(h)\), и прибавляет
$$c(h)\,2^{t(h-1)}$$
для всех \(t=1,\dots,\lfloor N/h\rfloor\). После каждого шага применяется модуль \(10^9+7\). Реализации на C++, Python и Java устроены одинаково; версия на C++ дополнительно содержит несколько небольших контрольных проверок.
Линейное решето для \(\varphi\) требует \(O(N)\) времени и \(O(N)\) памяти. Стоимость блочной суммы равна
$$\sum_{h=2}^{N}\left\lfloor\frac{N}{h}\right\rfloor=O(N\log N).$$
Значит, полное время работы составляет \(O(N\log N)\), а потребление памяти равно \(O(N)\).
لكل زوج \((n,k)\) يحقق \(1 \le k \le n\)، توجد دالة عدّ \(F(n,k)\) تمثل عدد الترتيبات الثنائية المسموح بها لعملات الدائرة المرتبطة بهذا الزوج. المطلوب هو حساب
$$S(N)=\sum_{n=1}^{N}\sum_{k=1}^{n} F(n,k)\pmod{10^9+7}.$$
الفكرة الأساسية في الحل هي أن التعداد المباشر للحالات ليس ضرورياً. فالتنفيذ يحول المسألة إلى بيانات عددية فقط: \(\gcd(n,k)\)، ومقارنة بين التقييمين 2-الأديين، ثم إعادة تجميع تعتمد على دالة أويلر \(\varphi\).
تنفيذات C++ وPython وJava كلها تتبع التفكيك العددي نفسه. بعد معرفة الصيغة المغلقة للزوج الثابت \((n,k)\)، يعاد ترتيب المجموع المزدوج بحيث تتجمع الحدود المتشابهة في كتل كبيرة.
ليكن
$$g=\gcd(n,k),$$
ولتكن \(v_2(x)\) هي أسّ العامل \(2\) في \(x\). الصيغة المستخدمة هي
$$F(n,k)=\begin{cases} 2^{n-g+1}, & v_2(k)\le v_2(n),\\ 2^{n-g}, & v_2(k)>v_2(n). \end{cases}$$
وهذا يعني أن البنية التوافقية للدائرة تُختزل إلى عنصرين فقط: القاسم المشترك \(g\) الذي يحدد الأساس \(n-g\)، ومقارنة 2-أدية واحدة تحدد هل يظهر عامل إضافي مقداره \(2\) أم لا.
نكتب
$$n=t h,\qquad k=t r,\qquad t=\gcd(n,k),\qquad \gcd(r,h)=1.$$
عندها يكون \(t\) هو نفسه القاسم المشترك في الصيغة السابقة، ومن ثم
$$n-g=t h-t=t(h-1).$$
بعد استخراج العامل المشترك، يمكن وصف كل زوج \((n,k)\) بواسطة مقام مختزل \(h\) وباقٍ مختزل \(r\) أولي مع \(h\). فتتحول الصيغة إلى
$$F(t h,t r)=\begin{cases} 2^{t(h-1)+1}, & v_2(r)\le v_2(h),\\ 2^{t(h-1)}, & v_2(r)>v_2(h). \end{cases}$$
وبذلك يصبح المطلوب، عند تثبيت \(h\) و\(t\)، هو عدّ عدد البواقي المختزلة \(r\) التي تحقق شرط التقييم.
ثبّت الآن \(h \ge 2\)، واجمع على جميع القيم \(r\) التي تحقق \(1 \le r \le h\) و\(\gcd(r,h)=1\).
إذا كان \(h\) زوجياً، فكل عدد أولي مع \(h\) لا بد أن يكون فردياً. لذلك \(v_2(r)=0\le v_2(h)\)، أي إن كل البواقي المختزلة تعطي القيمة الأكبر \(2^{t(h-1)+1}\). وعدد هذه البواقي هو \(\varphi(h)\)، ولذلك يكون المجموع
$$\varphi(h)\cdot 2^{t(h-1)+1}=2\varphi(h)\,2^{t(h-1)}.$$
أما إذا كان \(h\) فردياً، فإن البواقي المختزلة تنقسم بالتساوي إلى فردية وزوجية. والسبب أن كل \(r\) يقابله \(h-r\)، وهو أيضاً مختزل وله فردية معاكسة. لذا يحقق نصفها فقط الشرط \(v_2(r)=0=v_2(h)\)، بينما لا يحققه النصف الآخر.
من هذا التقسيم ينتج أن مساهمة كتلة ثابتة عند \(h \ge 2\) و\(t\) ثابت تساوي
$$c(h)\,2^{t(h-1)},$$
حيث
$$c(h)=\begin{cases} 2\varphi(h), & 2\mid h,\\ \dfrac{3\varphi(h)}{2}, & 2\nmid h. \end{cases}$$
وفي الحالة الفردية نحصل ببساطة على
$$\frac{\varphi(h)}{2}\cdot 2^{t(h-1)+1}+\frac{\varphi(h)}{2}\cdot 2^{t(h-1)} =\frac{3\varphi(h)}{2}\,2^{t(h-1)}.$$
هذه هي خطوة الاختزال الحاسمة: الاعتماد التفصيلي على \(k\) يختفي ويستبدل بمعامل واحد يعتمد فقط على \(\varphi(h)\).
الحالة \(h=1\) خاصة. عندها يكون \(k=n\)، وبالتالي \(g=n\) وتعطينا الصيغة مباشرة
$$F(n,n)=2.$$
وبجمع ذلك على جميع \(n=1,\dots,N\) نحصل على
$$2N.$$
أما إذا كان \(h \ge 2\)، فإن المتغير الحر هو \(t\)، وشرط \(n=t h \le N\) يعطينا
$$1\le t\le \left\lfloor\frac{N}{h}\right\rfloor.$$
إذن الصيغة النهائية هي
$$\boxed{S(N)=2N+\sum_{h=2}^{N} c(h)\sum_{t=1}^{\lfloor N/h\rfloor} 2^{t(h-1)} \pmod{10^9+7}.}$$
من الناحية الرياضية، المجموع الداخلي متتالية هندسية منتهية، لكن التنفيذ يمر على الأسس مباشرة بعد حساب قوى \(2\) مسبقاً.
المساهمة الخاصة هي
$$2N=6.$$
عند \(h=2\)، لدينا \(\varphi(2)=1\) و\(c(2)=2\)، ومع \(\lfloor 3/2\rfloor=1\) تكون مساهمة هذه الكتلة
$$2\cdot 2^{1}=4.$$
وعند \(h=3\)، لدينا \(\varphi(3)=2\) و\(c(3)=3\)، فتكون المساهمة
$$3\cdot 2^{2}=12.$$
ومن ثم
$$S(3)=6+4+12=22,$$
وهو يطابق قيمة التحقق في التنفيذ. كما يمكن التحقق من زوج منفرد: \(F(9,3)=2^{9-3+1}=128\)، لأن \(\gcd(9,3)=3\) و\(v_2(3)\le v_2(9)\).
تبدأ التنفيذات ببناء قيم دالة أويلر لكل الأعداد حتى \(N\) باستخدام غربال خطي. ثم يُحسب الجدول
$$2^0,2^1,\dots,2^N \pmod{10^9+7}$$
مسبقاً حتى تصبح كل قوة مطلوبة في المجموع الرئيسي متاحة مباشرة.
بعد ذلك يبدأ الخوارزم بالمساهمة الخاصة \(2N\)، ثم يمر على \(h=2,3,\dots,N\)، ويحسب المعامل \(c(h)\) من فردية \(h\) وقيمة \(\varphi(h)\)، ثم يضيف
$$c(h)\,2^{t(h-1)}$$
لكل \(t=1,\dots,\lfloor N/h\rfloor\). وتُختزل جميع العمليات modulo \(10^9+7\) في كل خطوة. تنفيذات C++ وPython وJava تتبع البنية الرياضية نفسها تماماً، مع وجود بعض اختبارات التحقق الصغيرة في نسخة C++ قبل الناتج النهائي الكبير.
الغربال الخطي لقيم \(\varphi\) يكلف \(O(N)\) زمناً ويستخدم \(O(N)\) ذاكرة. أما المجموع الكتلي فتكلفته
$$\sum_{h=2}^{N}\left\lfloor\frac{N}{h}\right\rfloor=O(N\log N).$$
لذلك يكون الزمن الكلي \(O(N\log N)\)، وتبقى الذاكرة الكلية \(O(N)\).