bestcoder#28 1002 dfs

bestcoder#28 1002  dfs

Fibonacci

Accepts: 40
Submissions: 996
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
Problem Description

Following is the recursive definition of Fibonacci sequence:

Fi=⎧⎩⎨01Fi1+Fi2i = 0i = 1i > 1
Now we need to check whether a number can be expressed as the product of numbers in the Fibonacci sequence.
Input

There is a number (T) shows there are (T) test cases below. (T100,000) For each test case , the first line contains a integers n , which means the number need to be checked. 0n1,000,000,000

Output

For each case output "Yes" or "No".

Sample Input
3
4
17
233
Sample Output
Yes
No
Yes

题意:判断n是否为一个或多个fib数的乘积
思路:dfs,从大数往小数遍历更省时
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<algorithm>
#include<vector>

using namespace std;

const int maxn=1000100;
const int INF=1000000000;

int T;
int n;
vector<int> fib;

inline int read()
{
    char c=getchar();
    while(c!='-'&&!isdigit(c)) c=getchar();
    int f=0,tag=1;
    if(c=='-'){
        tag=-1;
        f=getchar()-'0';
    }
    else f=c-'0';
    while(isdigit(c=getchar())) f=f*10+c-'0';
    return f*tag;
}

void creat_fib()
{
    fib.clear();
    fib.push_back(0);
    fib.push_back(1);
    int x=fib[0]+fib[1];
    while(x<=INF&&x>=0){
        fib.push_back(x);
        x=fib[fib.size()-1]+fib[fib.size()-2];
    }
}

bool dfs(int n,int t)
{
    if(t==2) return false;
    while(true){
        if(dfs(n,t-1)) return true;
        if(n%fib[t]) break;
        n/=fib[t];
    }
    if(n==1) return true;
    return false;
}

int main()
{
    cin>>T;
    creat_fib();
    while(T--){
        n=read();
        if(n==0||n==1||dfs(n,fib.size()-1)) printf("Yes
");
        else printf("No
");
    }
    return 0;
}
View Code
没有AC不了的题,只有不努力的ACMER!
原文地址:https://www.cnblogs.com/--560/p/4358647.html