HDU 5167 Fibonacci

来源:互联网 发布:搜索引擎优化建议 编辑:程序博客网 时间:2024/05/20 19:46

题目要求的是判断一个数是不是Fibonacci数的乘积,前面想当然以为只要是两个数的乘积就行,但显然两个以上的Fibnoacci数的乘积也是可以的。

找到错误之后就用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;}


0 0