时间限制1.00s 内存限制512.00MB 难易度:普及/提高−
【题目背景】
翻译自 ROIR 2023 D1T2。
斐波那契数指斐波那契数列(f0=1,f1=1,fi=fi−2+fi−1)中出现的数。
【题目描述】
给定一个自然数 n,求出将其表示为大于 1 的斐波那契数的乘积的方式数量。
【输入格式】
第一行一个数 t,表示数据组数。
接下来 t 行,每行输入一个数 n。
【输出格式】
对于每组测试数据,输出一个数表示答案。
【输入输出样例】
输入 #1
5 2 7 8 40 64
输出 #1
1 0 2 2 3
【说明/提示】
样例解释:
- 2=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。
本题使用捆绑测试。
子任务编号 | 分值 | 2\le n\le2≤n≤ |
---|---|---|
1 | 15 | 100 |
2 | 17 | 10^5 |
3 | 9 | n 是 2 的整数次幂 |
4 | 38 | 10^9 |
5 | 21 | 10^18 |
对于所有数据,1≤t≤50,2≤n≤1018。
【算法分析】
这道题用搜索做,不会TLE。因为数值较大,要用long long,深搜从2开始。
【参考代码】
#include<bits/stdc++.h>
using namespace std;
long long n,f[100],ans;
void fib(int x,long long y)
{
if(x==87) return;
if(y==1)
{
ans++;
return;
}
if(y%f[x]==0) fib(x,y/f[x]);
fib(x+1,y);
}
int main()
{
int t;
cin>>t;
f[0]=1;f[1]=1;
for(int i=2;i<=86;i++)
f[i]=f[i-1]+f[i-2]; //计算斐波那契数列。
while(t--)
{
cin>>n;
ans=0;
fib(2,n); //从二开始是因为第二项是第一个大于1的斐波那契数。
cout<<ans<<endl;
}
return 0;
}