洛谷 P1755 斐波那契的拆分

2019-04-13 21:34发布

题目背景

题目描述

已知任意一个正整数都可以拆分为若干个斐波纳契数,现在,让你求出n的拆分方法

输入输出格式

输入格式:
一个数t,表示有t组数据 接下来t行,每行一个数n(如题) 输出格式:
t行,每行一个字符串,表示拆分方法(格式:n=a1+a2+a3+..+an),要求从小到大输出

输入输出样例

输入样例#1:
input1:1 1 input2:1 10 输出样例#1:
output1:1=1; output2:10=2+8;

说明

若有多组数据,以个数最小的为准,若仍有多组,输出右边尽量大的一组 对于100%的数据 t<=1000 1<=n<=10^9

由于答案具有单调性,搜索应该比较快。 做这题之前,还专门打了一张斐波那契数列的表,觉得不会爆int,结果爆了,被坑了33分。 一定要开够。 一定要开够。 一定要开够。 其实这题是个大水题。
#include #include using namespace std; int t,ans,tmp[100005],res[100005]; long long n,f[1005]; void dfs(int cnt,long long lft,int lst) { if(cnt>=ans) return ; if(lft==0) { ans=cnt-1; for(int i=1;i<=ans;i++) res[i]=tmp[i]; } for(int i=lst;i>=1;i--) if(f[i]<=lft) { tmp[cnt]=i; dfs(cnt+1,lft-f[i],i); } } int main() { f[1]=f[2]=1; for(int i=3;i<=50;i++) f[i]=f[i-1]+f[i-2]; scanf("%d",&t); while(t--) { scanf("%lld",&n); ans=1e9+7; dfs(1,n,50); printf("%lld=",n); for(int i=ans;i>=2;i--) printf("%lld+",f[res[i]]); printf("%lld ",f[res[1]]); } return 0; }