打卡信奥刷题(1408)用C++实现信奥 B4219 [常州市赛 2023] 数学作业

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 15 1 ≤ n ≤ 10 4 1\le n\le 10^4 1n104
6 ∼ 8 6\sim8 68 1 ≤ n ≤ 10 9 1\le n\le 10^9 1n109
9 ∼ 10 9\sim10 910 1 ≤ n ≤ 10 12 1\le n\le 10^{12} 1n1012

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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值