题目背景
翻译自 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≤n≤1018 |
---|---|---|
1 | 15 | 100 |
2 | 17 | 105 |
3 | 9 | n 是 2 的整数次幂 |
4 | 38 | 109 |
5 | 21 | 1018 |
对于所有数据,1≤t≤50,2≤n≤1018。
思路
因为在 1018 的范围的斐波那契数只有 86 项,所以考虑暴搜。
看每一个斐波那契数能否整除 n,能就除掉接着找,不能就从比它小的下一个开始。
如果 n=1或除数为 1 时,就不能再除了。
#include<bits/stdc++.h>
using namespace std;
long long f[105]={1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155,165580141,267914296,433494437,701408733,1134903170,1836311903,2971215073,4807526976,7778742049,12586269025,20365011074,32951280099,53316291173,86267571272,139583862445,225851433717,365435296162,591286729879,956722026041,1548008755920,2504730781961,4052739537881,6557470319842,10610209857723,17167680177565,27777890035288,44945570212853,72723460248141,117669030460994,190392490709135,308061521170129,498454011879264,806515533049393,1304969544928657,2111485077978050,3416454622906707,5527939700884757,8944394323791464,14472334024676221,23416728348467685,37889062373143906,61305790721611591,99194853094755497,160500643816367088,259695496911122585,420196140727489673,679891637638612258,1100087778366101931};
long long dfs(long long n,long long x){
if(n==1)
{
return 1;
}
if(x==1)
{
return 0;
}
while(n<f[x])
{
x--;
}
long long ans=0;
if(!(n%f[x])){
ans+=dfs(n/f[x],x);
}
return ans+dfs(n,x-1);
}int main(){
long long t,n;
cin>>t;
while(t--)
{
cin>>n;
cout<<dfs(n,86)<<"\n";
}
return 0;
}
如有错误,欢迎大家评论区指出!感谢!