In der Tat gibt es dafür einen linearen Zeitalgorithmus. Sie müssen nur einige grundlegende Konzepte der Zahlentheorie verwenden. Bei zwei Zahlen und ist ihre Summe nur dann für teilbar , wenn die Summe ihres Restes für teilbar ist . Mit anderen Worten,n 2 K K.n1n2KK
K∣(n1+n2) ⟺ K∣((n1 mod K)+(n2 mod K)).
Das zweite Konzept , dass Sie beachten müssen , das heißt, die Summe von zwei Zahlen ist , nur wenn einer von ihnen ist streng kleiner als und das andere ist nicht weniger als . Mit anderen Worten, K K / 2 K / 2r1≠r2KK/2K/2
r1+r2=K ⇒ r1<K/2, r2≥K/2 (r1≠r2, w.l.g. r1<r2).
Das dritte Konzept , dass Sie beachten müssen, ist , dass, wenn die Summe von zwei Zahlen ist , sie beide weichen von durch eine bestimmte dh K ⌈ K / 2 ⌉ - 1 k ≤ ⌈ K / 2 ⌉r1≠r2K⌈K/2⌉−1k≤⌈K/2⌉
r1+r2=K ⇒ ∃k≤⌈K/2⌉−1 such that r1=⌈K/2⌉−1−k, r2=⌈K/2⌉+k.
Also, für Evey im dritten Konzept, müssen Sie entweder setzen oder in der Lösungsmenge, aber nicht beide. Sie dürfen eine der Zahlen eingeben, die tatsächlich durch teilbar sind, und wenn ist, können Sie nur eine Zahl hinzufügen, deren Rest .r 1 r 2 K K K / 2kr1r2KKK/2
Daher ist hier der Algorithmus.
Wenn eine Menge ist, finden wir die LösungsmengeS ,N={n1,n2,⋯,nN}S,
- Betrachten SieR={r1=(n1 mod K),r2=(n2 mod K),⋯,rN=(nN mod K)}
- S←∅
- für zu :⌈ K / 2 ⌉ - 1k←1⌈K/2⌉−1
- if :count(R,k)≥count(R,K−k)
- addiere alle zu , so dassS r i = kniSri=k
- else:
- addiere alle zu , so dassS r i = K - kniSri=K−k
- füge nur ein zu so dass // falls vorhandenS r i = 0niSri=0
- wenn ist:K
- füge nur ein , so dass // falls vorhandenS r i = K / 2niSri=K/2
- AusgabeS
Der Algorithmus ist ziemlich lang, aber die Idee ist sehr einfach.