HDU 5167 Fibonacci
2015-02-02 10:23
281 查看
题目要求的是判断一个数是不是Fibonacci数的乘积,前面想当然以为只要是两个数的乘积就行,但显然两个以上的Fibnoacci数的乘积也是可以的。
找到错误之后就用DFS搜索一遍就OK了,但姿势不好的话,就会超时。
姿势不好的dfs
正解
找到错误之后就用DFS搜索一遍就OK了,但姿势不好的话,就会超时。
姿势不好的dfs
int dfs(long long n){ if(n==1) return 1; for(int i=0;i<cnt;i++){ if(n%fac[i]==0&&dfs(n/fac[i])) return 1; } return 0; }
正解
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; long long Fb[2000]={0,1}; long long fac[100]={0}; int cnt=0; int dfs(long long n,int now){ if(n==1) return 1; for(int i=now;i<cnt;i++){ if(n%fac[i]==0&&dfs(n/fac[i],i)) return 1; } return 0; } int main(){ for(int i=2;i<46;i++){ Fb[i]=Fb[i-1]+Fb[i-2]; } int t; cin>>t; while(t--){ long long num; int flag=0; scanf("%I64d",&num); if(num==0){ printf("Yes\n"); continue; } else{ cnt=0; int flag=0; for(int i=3;Fb[i]<=num;i++){ if(num%Fb[i]==0){ fac[cnt++]=Fb[i]; } } flag=dfs(num,0); if(flag) printf("Yes\n"); else printf("No\n"); } } return 0; }
相关文章推荐
- HDU 5167 Fibonacci 筛法+乱搞
- hdu 5167 Fibonacci(dfs)
- HDU 5167 Fibonacci (DFS + Fib数列)
- hdu 5167 Fibonacci
- 【DFS】hdu 5167 Fibonacci
- hdu-5167 Fibonacci
- hdu 5167 Fibonacci【思维】【递归】
- hdu 5167 Fibonacci(DFS)
- HDU 5167 Fibonacci——BestCoder Round #28(搜索+预处理)
- HDU 5167 Fibonacci(DFS暴力搜索)
- hdu 5167 Fibonacci(dfs)
- 【预处理】 HDU 5167 Fibonacci
- hdu 5167 Fibonacci(DFS,剪枝,斐波那契)
- 【CUGBACM15级BC第28场 B】hdu 5167 Fibonacci
- HDU_5167_Fibonacci
- HDU - 5166 - Missing number && 5167 - Fibonacci
- hdu 5167 Fibonacci(预处理)
- hdu 5167 Fibonacci 打表
- HDU - 5167 - Fibonacci
- hdu 5167-Fibonacci