51nod 1350 斐波那契表示 (數學)

2021-08-10 16:00:28 字數 1503 閱讀 2816

每乙個正整數都可以表示為若干個斐波那契數的和,乙個整數可能存在多種不同的表示方法,例如:14 = 13 + 1 = 8 + 5 + 1,其中13 + 1是最短的表示(只用了2個斐波那契數)。定義f(n) = n的最短表示中的數字個數,f(14) = 2,f(100) = 3(100 = 3 + 8 + 89),f(16) = 2(16 = 8 + 8 = 13 + 3)。定義g(n) = f(1) + f(2) + f(3) + …… f(n),g(6) = 1 + 1 + 1 + 2 + 1 + 2 = 8。給出若干個數字n,求對應的g(n)。

第1行:乙個數t,表示後面用作輸入測試的數的數量(1 <= t <= 50000)。

第2 - t + 1行:每行1個數n(1 <= n <= 10^17)。

輸出共t行:對應每組資料g(n)的值。

313

6

1

38

搞清楚斐波那契數列表示的本質這道題目就會變得非常簡單。

其遞推式: f0

=f1=

1,fi

=fi−

1+fi

−2(i

>=2)

顯然,對於乙個斐波那契數來說,fi

=1,否則它一定存在於兩個斐波那契數之間,對於這樣的數,它的最短表示一定和它之前的若干個斐波那契數有關。

有這樣乙個規律:

比如,當 i=6 時,13 開始的連續 8 項,即 f[13],f[14],f[15]……f[20] 為 1,2,2,2,3,2,3,3

前 5 項 正好和 f[8],f[9],f[10],f[11],f[12] 一樣

後 3 項為 f[5]+1,f[6]+1,f[7]+1

我們定義, si

表示從 fi

開始的連續 fi

−1項的最短表示之和。則 s

i=si

−1+s

i−2+

fi−3

,其中 s1

=s2=

1 。

剩下的根據規律隨便寫寫就可以了。

#include

#define io ios::sync_with_stdio(false);\

cin.tie(0);\

cout.tie(0);

using

namespace

std;

const

int maxn = 88;

typedef

long

long ll;

ll f[maxn],s[maxn];

void init()

ll sear(int o,ll step)

int main()

51 nod 1350 斐波那契表示

每乙個正整數都可以表示為若干個斐波那契數的和,乙個整數可能存在多種不同的表示方法,例如 14 13 1 8 5 1,其中13 1是最短的表示 只用了2個斐波那契數 定義f n n的最短表示中的數字個數,f 14 2,f 100 3 100 3 8 89 f 16 2 16 8 8 13 3 定義g ...

51nod 1350 斐波那契表示 找規律遞推

分析 找規律。首先可以歸納證明,對於n,最佳的取法是先取不大於n的最大的那個斐波那契數,然後遞推.從而可以得到算出f n 的乙個方法,但是n的範圍太大了,先算出n較小的情況,會發現 第三列為f n 第二列為g n 可以看出第k塊是由k 1塊和k 2塊 1合在一起得到的,從而可以先預處理前k塊之和 k...

斐波那契數列 斐波那契數列python實現

斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 ...