题目背景
翻译自 ROIR 2023 D1T2。
斐波那契数指斐波那契数列(f0=1,f1=1,fi=fi−2+fi−1)中出现的数。
题目描述
给定一个自然数 n,求出将其表示为大于 11 的斐波那契数的乘积的方式数量。
输入格式
第一行一个数 t,表示数据组数。
接下来 t 行,每行输入一个数 n。
输出格式
对于每组测试数据,输出一个数表示答案。
输入输出样例
输入 #1
5 2 7 8 40 64
输出 #1
1 0 2 2 3
说明/提示
样例解释:
- 2=22=2。
- 7 无法被表示为斐波那契乘积。
- 8=8=2×2×2。
- 40=5×8=2×2×2×5。
- 64=8×8=2×2×2×8=2×2×2×2×2×2。
本题使用捆绑测试。
思路
不如先算出前86个斐波那契数,然后我们进行作除运算。
AC代码
#include<bits/stdc++.h>
using namespace std;
long long a[90]={1,1};
long long dfs(long long n,long long m)
{
if(n==1)return 1;
if(m<=1)return 0;
while(n<a[m])m--;
long long ans=0;
if(!(n%a[m]))
{
ans+=dfs(n/a[m],m);
}
return ans+dfs(n,m-1);
}
int main()
{
//freopen("x.in","r","stdin");
//freopen("x.out","w","stdout");
long long t,n;
cin>>t;
for(int i=2;i<=86;i++)a[i]=a[i-1]+a[i-2];
for(int i=1;i<=t;i++)
{
cin>>n;
cout<<dfs(n,86)<<endl;
}
return 0;
}