题目及代码:这道题目的意思是 给定一个数n,问这个数n是否能由斐波那契数列中的数的乘积组合而成。
首先想到一定会要先打表把所有的斐波那契数求出来,然后直接dfs就ok了。做题的时候很犹豫这样搜索到底行不行,总感觉会超时,结果却过了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
ll n,nt[50];
bool dfs(ll vt,int st)
{
if(vt==1)
{
return 1;
}
for(int i=st;i>=3;i--)
{
if(vt%nt[i]==0)
{
bool flag=dfs(vt/nt[i],i);
if(flag) return flag;
}
}
return 0;
}
int main()
{
nt[0]=0;nt[1]=1;
for(int i=2;i<=45;i++)
{
nt[i]=nt[i-1]+nt[i-2];
}
int cas;
scanf("%d",&cas);
while(cas--)
{
scanf("%I64d",&n);
if(n==0||dfs(n,45)) printf("Yes\n");
else printf("No\n");
}
return 0;
}