蒜頭君爬樓梯(1) 計蒜客

2021-10-18 22:56:28 字數 1931 閱讀 1818

目錄

題目  題解

蒜頭君很喜歡爬樓梯,但是蒜頭君腿不夠長,每次蒜頭君最多只能一步跨越兩個階梯。比如他初始在樓底,跨越乙個階梯到達

1號階梯,或者跨越兩個階梯到達

2號階梯。如下圖

為了選出一種最輕鬆的爬樓梯的方式,蒜頭君想把所有不同的到達樓頂的方式都嘗試一遍。對於一共有

n 個階梯的樓梯,蒜頭君一共有多少總方法從樓底到達樓頂。

由於最後答案可能很大,輸出最後的答案對

100007 

取模的結果。

輸入格式

第一行輸入乙個整數

n(1≤

n≤1000)。

輸出格式

輸出最後答案對於

100007

取模的結果。

輸出時每行末尾的多餘空格,不影響答案正確性

要求使用「檔案輸入輸出」的方式解題,輸入檔案為

stairs.in

,輸出檔案為

stairs.out

樣例輸入4

樣例輸出5

知識點:遞推的應用分析:其實本題主要是找規律,其次如果學過小學奧數的可以用乙個法子來做。這道題比較容易得出是求斐波拉契數列,所以只需要遞推即可。

**:

#include#includeusing namespace std;

const int mod=100007;

int main()

if (x <= 2)

else

}int main()

方法三:

知識點:矩陣快速冪的應用

分析:其實本題主要是找規律,其次如果學過小學奧數的可以用乙個法子來做。這道題比較容易得出是求斐波拉契數列,所以只需要矩陣快速冪求解即可。

什麼是記憶化搜尋?矩陣快速冪是level4的內容,就是把結果初始化為

1的部分改為了初始化為單位矩陣,乘法部分換成了矩陣乘法,引數和返回值相應換成了矩陣而已。

**:

/*

因為fib(n)至於最近的倆個序列有關(及fib(n-1)和fib(n-2)),所以我們儲存最近的那倆個就行了。

設f(n)表示乙個1*2的矩陣,f(n)=[fib(n),fib(n+1)],可以看成【a,b】–>【a+b,b】;

所以可以變成f(n)=f(n-1)*a; (a表示乙個二維矩陣) a[2][2]=,};

然後就可以得到最終的表示式 f(n)=*a^n(表示矩陣a的n次方);

難點也就在於如何求矩陣a的n次方。這就需要結合快速冪的方法求矩陣的冪次。

為了方便起見,這裡我用c語言風格來書寫

*/#include#includeusing namespace std;

typedef long long ll;

const int mod=10000;

void mul(int f[2] ,int a[2][2])

void mulself(int a[2][2])

int main();

int a[2][2]=,};

while(n)

printf("%d\n",f[0]);

} return 0;

}

蒜頭君爬樓梯(2) 計蒜客

目錄 題目 題解 1 號階梯,或者跨越 3個樓梯到達 3號階梯。如下圖 為了選出一種最輕鬆的爬樓梯的方式,蒜頭君想把所有不同的到達樓頂的方式都嘗試一遍。對於一共有 n 個階梯的樓梯,蒜頭君一共有多少總方法從樓底到達樓頂。由於最後答案可能很大,輸出最後的答案對 100007 取模的結果。輸入格式 第一...

計蒜客 題庫 爬樓梯

題目 假設你現在正在爬樓梯,樓梯有 n級。每次你只能爬 1級或者 2級,那麼你有多少種方法爬到樓梯的頂部?第一行輸入乙個整數 n 1 n 50 代表樓梯的級數。輸出爬到樓梯頂部的方法總數。樣例輸入5 樣例輸出8 思路 每次只能爬1或者2級,也就是說可以從前n 1 n 2兩級任意一級到達n級,那麼到達...

計蒜客第16題 爬樓梯

假設你現在正在爬樓梯,樓梯有n級。每次你只能爬1級或者2級,那麼你有多少種方法爬到樓梯的頂部?格式 第一行輸入乙個數n n 50 代表樓梯的級數。接下來一行輸出你的方法總數。樣例1 輸入 5 輸出 8 很容易想到這道題可以用遞迴的方法 分析 假設從底走到第n級的走法有f n 種,走到第 級有兩個方法...