-3 byte -1 byte nhờ ThePirateBay
-8 -9 byte nhờ 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]
Hãy thử trực tuyến!
Lưu ý: giải pháp này dựa trên thực tế là không bao giờ có nhiều giải pháp tối thiểu.
Bằng chứng là không bao giờ có nhiều giải pháp:
Hãy FIB(a,b,k)
là chuỗi giống như Fibonacci bắt đầu bằng 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)
Bổ đề 1
Sự khác biệt giữa các chuỗi giống như Fibonacci là chính nó giống như Fibonacci, nghĩa là FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
. Bằng chứng là để lại cho người đọc.
Bổ đề 2
Đối với n >= 5
, một giải pháp a,b
tồn tại thỏa mãna+b < n
:
nếu n
là chẵnFIB(0,n/2,3) = n
nếu n
là số lẻ,FIB(1,(n-1)/2,3) = n
Bằng chứng
Các trường hợp n < 5
có thể được kiểm tra một cách triệt để.
Giả sử chúng ta có hai giải pháp tối thiểu cho n >= 5
, a0,b0
và a1,b1
với a0 + b0 = a1 + b1
và a0 != a1
.
Sau đó tồn tại k0,k1
như vậy đó FIB(a0,b0,k0) = FIB(a1,b1,k1) = n
.
Trường hợp 1: k0 = k1
WLOG giả định b0 < b1
(và do đó a0 > a1
)
Hãy DIFF(k)
là sự khác biệt giữa các chuỗi giống như Fibonnaci bắt đầu bằng a1,b1
và a0,b0
:
DIFF(k) = FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
(Bổ đề 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
Khi một chuỗi giống như Fibonnaci có 2 thuật ngữ tích cực, tất cả các điều khoản tiếp theo đều tích cực.
Vì vậy, thời gian duy nhất DIFF(k) = 0
là khi k = 2
, vì vậy sự lựa chọn duy nhất k0 = k1
là 2
.
vì thế n = FIB(a0,b0,2) = a0 + b0 = a1 + b1
Tính tối thiểu của các giải pháp này mâu thuẫn với Bổ đề 2.
Trường hợp 2 k0 != k1
::
Giả sử k0 < k1
.
Chúng ta có FIB(a1,b1,k1) = n
Để cho a2 = FIB(a1,b1,k1-k0)
Để cho b2 = FIB(a1,b1,k1-k0+1)
Sau đó FIB(a2,b2,k0) = FIB(a1,b1,k1) = FIB(a0,b0,k0)
(tập thể dục cho người đọc)
Vì FIB(a1,b1,k)
không âm đối với k >= 0
, nó cũng không giảm.
Điều này cho chúng ta a2 >= b1 > a0
và b2 >= a1+b1 = a0+b0
.
Sau đó cho phép DIFF(k) = FIB(a2,b2,k) - FIB(a0,b0,k) = FIB(a2-a0,b2-b0,k)
(Bổ đề 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
Một lần nữa, DIFF
có 2 điều khoản tích cực và do đó tất cả các điều khoản tiếp theo là tích cực.
Do đó, thời gian chỉ khi nó có thể là DIFF(k) = 0
là k = 1
, vì vậy lựa chọn duy nhất cho k0
là 1
.
FIB(a0,b0,1) = n
b0 = n
Điều này mâu thuẫn với Bổ đề 2.
a>=0
vàa<b
có bao giờ nhiều giải pháp?