测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A23493. 数学作业今天小X的数学老师带领大家学习了斐波那契序列:斐波那契序列指的是这样一个数列:1、2、3、5、8、13、21、34。从第3个数开始,每个数都是前两个数的和,比如8=3+5,34=13+21。数列里的数叫做斐波那契数。一个数n的斐波那契表示是指把n写成若干个互不相同的斐波那契数的和。一个数可以有多种不同的斐波那契表示。比如14有三种斐波那契表示:14=1+13,14=1+5+8,14=1+…

填空题 较难

题目描述

数学作业

今天小X的数学老师带领大家学习了斐波那契序列:

斐波那契序列指的是这样一个数列:1、2、3、5、8、13、21、34。从第3个数开始,每个数都是前两个数的和,比如8=3+5,34=13+21。数列里的数叫做斐波那契数。

一个数n的斐波那契表示是指把n写成若干个互不相同的斐波那契数的和。一个数可以有多种不同的斐波那契表示。比如14有三种斐波那契表示:14=1+13,14=1+5+8,14=1+2+3+8。数学老师给小X留下了一个数学作业,她告诉小X一个正整数n,想让小X算出n有多少种不同的斐波那契表示。

小X请你帮助他完成他的数学作业。

输入

第一行为一个正整数n。

输出

输出一行一个整数表示答案。

样例输入1

14

样例输入2

1110

样例输入3

1000000000000

样例输出1

3

样例输出2

21

样例输出3

283392

数据范围

对于测试点1-5:1<=n<=10^4

对于测试点6-8:1<=n<=10^9

对于测试点9-10:1<=n<=10^12

参考答案

#include <iostream> #include <vector> using namespace std; vector<long long> fib; // 预处理斐波那契数列(1,2,3,5,...) void init_fib(long long n) { fib.push_back(1); fib.push_back(2); while (true) { long long next = fib.back() + fib[fib.size() - 2]; if (next > n) break; fib.push_back(next); } } // 递归计算表示数 long long count_ways(long long n, int idx) { if (n == 0) return 1; if (idx < 0 || fib[idx] > n) return 0; // 不选当前fib[idx] long long res = count_ways(n, idx - 1); // 选当前fib[idx](跳过前一个,避免重复) res += count_ways(n - fib[idx], idx - 2); return res; } int main() { long long n; cin >> n; init_fib(n); cout << count_ways(n, fib.size() - 1) << endl; return 0; }
上一题 下一题