目錄
題目 題解
蒜頭君很喜歡爬樓梯,但是蒜頭君腿不夠長,每次蒜頭君最多只能一步跨越兩個階梯。比如他初始在樓底,跨越乙個階梯到達知識點:遞推的應用分析:其實本題主要是找規律,其次如果學過小學奧數的可以用乙個法子來做。這道題比較容易得出是求斐波拉契數列,所以只需要遞推即可。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 種,走到第 級有兩個方法...