-3 byte -1 byte berkat ThePirateBay
-8 -9 byte terima kasih kepada Neil.
f=(n,a=1,b=0,c=(a,b)=>b<n?c(a+b,a):b>n)=>c(a,b)?b+2<a?f(n,a-1,b+1):f(n,b-~a):[b,a]
Cobalah online!
Catatan: solusi ini bergantung pada kenyataan bahwa tidak pernah ada beberapa solusi minimal.
Bukti bahwa tidak pernah ada banyak solusi:
Membiarkan FIB(a,b,k)
menjadi urutan Fibonacci seperti dimulai dengan a,b
:
FIB(a,b,0) = a
FIB(a,b,1) = b
FIB(a,b,k) = FIB(a,b,k-1) + FIB(a,b,k-2)
Lemma 1
Perbedaan antara urutan Fibonacci adalah Fibonacci itu sendiri, yaitu FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
. Buktinya diserahkan kepada pembaca.
Lemma 2
Sebab n >= 5
, a,b
ada solusi yang memuaskan a+b < n
:
jika n
genap,FIB(0,n/2,3) = n
jika n
aneh,FIB(1,(n-1)/2,3) = n
Bukti
Kasus-kasus dimana n < 5
dapat diperiksa secara mendalam.
Misalkan kita memiliki dua solusi minimal untuk n >= 5
, a0,b0
dan a1,b1
dengan a0 + b0 = a1 + b1
dan a0 != a1
.
Lalu ada yang k0,k1
seperti itu FIB(a0,b0,k0) = FIB(a1,b1,k1) = n
.
Kasus 1: k0 = k1
WLOG menganggap b0 < b1
(dan karenanya a0 > a1
)
Membiarkan DIFF(k)
menjadi perbedaan antara urutan seperti Fibonnaci dimulai dengan a1,b1
dan a0,b0
:
DIFF(k) = FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
(Lemma 1)
DIFF(0) = a1 - a0 < 0
DIFF(1) = b1 - b0 > 0
DIFF(2) = (a1+b1) - (a0+b0) = 0
DIFF(3) = DIFF(1) + DIFF(2) = DIFF(1) > 0
DIFF(4) = DIFF(2) + DIFF(3) = DIFF(3) > 0
Setelah urutan seperti Fibonnaci memiliki 2 istilah positif, semua istilah berikutnya positif.
Jadi, satu-satunya waktu DIFF(k) = 0
adalah kapan k = 2
, jadi satu-satunya pilihan k0 = k1
adalah 2
.
Karena itu n = FIB(a0,b0,2) = a0 + b0 = a1 + b1
Minimal dari solusi ini bertentangan dengan Lemma 2.
Kasus 2 k0 != k1
::
WLOG berasumsi k0 < k1
.
Kita punya FIB(a1,b1,k1) = n
Membiarkan a2 = FIB(a1,b1,k1-k0)
Membiarkan b2 = FIB(a1,b1,k1-k0+1)
Kemudian FIB(a2,b2,k0) = FIB(a1,b1,k1) = FIB(a0,b0,k0)
(berolahraga untuk pembaca)
Karena FIB(a1,b1,k)
tidak negatif untuk k >= 0
, itu juga tidak menurun.
Ini memberi kita a2 >= b1 > a0
dan b2 >= a1+b1 = a0+b0
.
Kalau begitu biarkan DIFF(k) = FIB(a2,b2,k) - FIB(a0,b0,k) = FIB(a2-a0,b2-b0,k)
(Lemma 1)
DIFF(0) = a2 - a0 > 0
DIFF(1) = b2 - b0 >= (a0 + b0) - b0 = a0 >= 0
DIFF(2) = DIFF(0) + DIFF(1) >= DIFF(0) > 0
DIFF(3) = DIFF(1) + DIFF(2) >= DIFF(2) > 0
Sekali lagi, DIFF
memiliki 2 istilah positif dan oleh karena itu semua istilah berikutnya adalah positif.
Jadi, satu-satunya waktu ketika itu mungkin DIFF(k) = 0
adalah k = 1
, jadi satu-satunya pilihan k0
adalah 1
.
FIB(a0,b0,1) = n
b0 = n
Ini bertentangan dengan Lemma 2.
a>=0
dana<b
adakah solusi berganda?