Erste Anmerkung, es ist einfacher, das Problem zu beschränken, und ignorieren Sie die untere Grenze (dh: behandeln L = 1). Wenn wir teilbare Zahlen durch die Primzahlen zählen < = N für jede N, können wir zählen sie auch auf einem Intervall, durch die Anzahl der Zahlen subtrahieren < = L-1 von der Zählung < = R.
Gegeben eine beliebige Anzahl x, die Anzahl der Zahlen < = R teilbar durch x ist Boden (R/x).
Jetzt können wir die inclusion-exclusion principle anwenden, um das Ergebnis zu erhalten. Zuerst zeige ich die Ergebnisse von Hand für 3 Primzahlen p1, p2 und p3 und gebe dann das allgemeine Ergebnis an.
Die Zählung von Zahlen < = R teilbar durch p1, p2 oder p3 ist:
R/p1 + R/p2 + R/p3
- R/(p1p2) - R/(p1p3) - R/(p2p3)
+ R/(p1p2p3)
(Hier wird angenommen /
Integer-Division werden Abrundungs).
Der allgemeine Fall ist wie folgt:
sum((-1)^(|S|+1) * R/prod(S) for S a non-empty subset of {p1, p2, .., pN}).
Hier S
Bereiche über alle Teilmengen Ihrer Primzahlen, prod(S)
ist das Produkt der Primzahlen in der Teilmenge und die anfängliche Laufzeit variiert zwischen -1 und +1 abhängig von der Größe der Teilmenge.
Für Ihr Problem, N < = 10, so gibt es 1023 nicht leere Subsets, die eine kleine Anzahl von Dingen durchlaufen.
Hier einige Beispiel Python-Code: nur abhängig von der Anzahl der Primzahlen
from itertools import *
def powerset(iterable):
s = list(iterable)
return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
def prod(ns):
r = 1
for n in ns:
r *= n
return r
def divs(primes, N):
r = 0
for S in powerset(primes):
if not S: continue
sign = 1 if len(S) % 2 else -1
r += sign * (N // prod(S))
return r
def divs_in_range(primes, L, R):
return divs(primes, R) - divs(primes, L-1)
Beachten Sie, dass die Laufzeit dieses Codes mehr oder weniger ist, und nicht so sehr auf die Größen L und R.
Es ist unmöglich, da es O (n) solche Zahlen gibt (angenommen n ist die Intervalllänge). – user4759923
@ user4759923 Anzahl der gegebenen Primzahlen (N) wird sehr weniger sein. Können wir das irgendwie nutzen? – Codename
Nein, weil es im Intervall O (n) Zahlen gibt, die durch P1 teilbar sind. – user4759923