用 Fibonacci 递推计数:每天吃掉 1 或 2 块,f[i]=f[i-1]+f[i-2],滚动变量 O(1) 空间实现。
OJ: roj
题目 ID: 1193
难度:入门
标签:递推Fibonacci入门
创建: 2026-09-29 22:51
更新: 2026-10-05 05:11
题目描述
名名有
输入格式
输入一行,整数
输出格式
输出一行,方案数。
样例输入
text
4样例输出
text
5思路
设
参考代码
Python 版:
python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 22:52
# update_at: 2026-09-29 22:52
import sys
def solve() -> None:
n: int = int(sys.stdin.buffer.read())
a = b = 1 # f[0] = f[1] = 1
for _ in range(2, n + 1):
a, b = b, a + b # 滚动到 f[i]
print(b)
if __name__ == "__main__":
solve()C++ 版(同一算法):
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-10-05 05:11
* update_at: 2026-10-05 05:11
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n; // 巧克力总数
ll a = 1, b = 1; // a=f[i-2], b=f[i-1],初始 f[0]=f[1]=1
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
// 滚动递推:f[i] = f[i-1] + f[i-2]
for (ll i = 2; i <= n; i++) {
ll c = a + b; // c 为 f[i]
a = b;
b = c;
}
cout << b << "\n";
return 0;
}