B4219 [常州市赛 2023] 数学作业
题目背景
搬运自 http://czoj.com.cn/p/676。数据为民间数据。
题目描述
今天小 X 的数学老师带领大家学习了斐波那契序列:
斐波那契序列指的是这样一个数列: { 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 } \{1,2,3,5,8,13,21,34\} {1,2,3,5,8,13,21,34}。从第 3 3 3 个数开始,每个数都是前两个数的和,比如 8 = 3 + 5 , 34 = 13 + 21 8=3+5,34=13+21 8=3+5,34=13+21。数列里的数叫做斐波那契数。
一个数 n n n 的斐波那契表示是指把 n n n 写成若干个互不相同的斐波那契数的和。一个数可以有多种不同的斐波那契表示。比如 14 14 14 有三种斐波那契表示: 14 = 1 + 13 , 14 = 1 + 5 + 8 , 14 = 1 + 2 + 3 + 8 14=1+13,14=1+5+8,14=1+2+3+8 14=1+13,14=1+5+8,14=1+2+3+8。数学老师给小 X 留下了一个数学作业,她告诉小 X 一个正整数 n n n,想让小 X 算出 n n n 有多少种不同的斐波那契表示。
小 X 请你帮助他完成他的数学作业。
输入格式
第一行为一个正整数 n n n。
输出格式
输出一行一个整数表示答案。
输入输出样例 #1
输入 #1
14
输出 #1
3
输入输出样例 #2
输入 #2
1110
输出 #2
21
输入输出样例 #3
输入 #3
1000000000000
输出 #3
283392
说明/提示
| 测试点编号 | n n n |
|---|---|
| 1 ∼ 5 1\sim5 1∼5 | 1 ≤ n ≤ 10 4 1\le n\le 10^4 1≤n≤104 |
| 6 ∼ 8 6\sim8 6∼8 | 1 ≤ n ≤ 10 9 1\le n\le 10^9 1≤n≤109 |
| 9 ∼ 10 9\sim10 9∼10 | 1 ≤ n ≤ 10 12 1\le n\le 10^{12} 1≤n≤1012 |
C++实现
#include<bits/stdc++.h>
#define LL long long
#define inf 0x3f3f3f3f
using namespace std;
const int N=1e2+10;
long long n,f[N]={1,1},ss[N]={1,2};
int ans,len;
void dfs(long long sum,int last){
if(n-sum>ss[last]) return;
if(sum==n) {
ans++; //计数器累加
return;
}
for(int i=last;i>=1;i--) {
if(sum+f[i]<=n) {
dfs(sum+f[i],i-1);
}
}
}
int main(){
cin>>n;
for(int i=2;i<=60;i++) {
f[i]=f[i-1]+f[i-2];
ss[i]=f[i]+ss[i-1];
if(f[i]>=n) //大于时,记录长度并退出
{
len=i;
break;
}
}
dfs(0,len);
cout<<ans<<endl;
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
35

被折叠的 条评论
为什么被折叠?



