HDU_5167_Fibonacci

来源:互联网 发布:c语言进阶书籍 编辑:程序博客网 时间:2024/03/29 22:38

HDU 5167

题意:判断一个数(0≤n≤1,000,000,000)能否表示成菲波数的乘积(即该数的所有因子都是菲波数);思路:先把0≤n≤1,000,000,000内的菲波数放到一个数组中,再在对该数的分解时dfs。
#include <iostream>#include <iomanip>#include <cstring>#include <cstdio>#include <cstdlib>#include <cmath>#include <set>#include <map>#include <list>#include <stack>#include <deque>#include <queue>#include <vector>#include <algorithm>#include <functional>#define PI acos(-1.0)#define eps 1e-10#define INF 0x7fffffff#define debug(x) cout << "--------------> " << x << endltypedef long long LL;typedef unsigned long long ULL;using namespace std;long long fibo[50];int mark[100001] = {0};bool dfs(LL num, int k){        if (num < 100001 && mark[num] != 0)        {                return mark[num] - 1;        }        if (num == 1)        {                return 1;        }        for (int i = k; i > 2; --i)                if (num % fibo[i] == 0 && dfs(num / fibo[i], i))                {                        if (num < 100001)                        {                                mark[num] = 2;                        }                        return 1;                }        if (num < 100001)        {                mark[num] = 1;        }        return 0;}int main(){        fibo[0] = 0;        fibo[1] = 1;        for (int i = 2; i < 50; ++i)        {                fibo[i] = fibo[i - 1] + fibo[i - 2];        }        int T;        scanf("%d", &T);        LL num;        while (T--)        {                scanf("%lld", &num);                if (num == 0 || num == 1)                {                        printf("Yes\n");                }                else                {                 dfs(num, 45) ? printf("Yes\n") :printf("No\n");                }        }        return 0;}
0 0