设为首页 加入收藏

TOP

hdu 5167 Fibonacci
2015-07-20 17:21:33 来源: 作者: 【 】 浏览:2
Tags:hdu 5167 Fibonacci

hdu 5167 Fibonacci

?

题意:

fi[0]=0,fi[1]=1
fi[i]=fi[i-1]+fi[i-2] i>1
给出一个数n,问这个数能不能有fi[]相乘得来。
限制:
0 <= n <= 1e9
思路:

1e9以内的斐波那契数只有44个,用记忆化搜索可以解决这道题。

?

?

C++ Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
? /*hdu 5167 Fibonacci
题意:
fi[0]=0,fi[1]=1
fi[i]=fi[i-1]+fi[i-2] i>1
给出一个数n,问这个数能不能有fi[]相乘得来。
限制:
0 <= n <= 1e9
思路:
1e9以内的斐波那契数只有44个,用记忆化搜索可以解决这道题。
*/
#include
#include
#include
using namespace std;
#define LL __int64
const int LIM=1e9+5;
LL fi[300];
map vis;
int cnt=0;
void predo(){
fi[1]=1;
fi[2]=1;
vis[0]=1;
vis[1]=1;
cnt=2;
for(int i=3;fi[i-1]+fi[i-2] fi[i]=fi[i-1]+fi[i-2];
vis[fi[i]]=1;
++cnt;
}
}
bool gao(int n){
if(vis[n]==1) return true;
if(vis[n]==-1) return false;
for(int i=3;i<=cnt;++i){
if(fi[i]>n) break;
if(n%fi[i]==0){
if(gao(n/fi[i])){
vis[n]=1;
return true;
}
else{
vis[n]=-1;
}
}
}
return false;
}
int main(){
predo();
int T;
scanf(%d,&T);
LL n;
while(T--){
scanf(%I64d,&n);
if(gao(n)) puts(Yes);
else puts(No);
}
return 0;
}


?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇BZOJ 1856 SCOI2010 字符串 组合.. 下一篇uva 208 Firetruck (回溯)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C 内存管理 | 菜鸟教 (2025-12-26 20:20:37)
·如何在 C 语言函数中 (2025-12-26 20:20:34)
·国际音标 [ç] (2025-12-26 20:20:31)
·微服务 Spring Boot (2025-12-26 18:20:10)
·如何调整 Redis 内存 (2025-12-26 18:20:07)