hdu 5167 Fibonacci
问题描述
斐波那契数列的递归定义如下: Fi=???01Fi?1+Fi?2i = 0i = 1i > 1 现在我们需要判断一个数是否能表示为斐波那契数列中的数的乘积。
输入描述
有多组数据,第一行为数据组数T(T≤100,000)。 对于每组数据有一个整数n,表示要判断的数字。 0≤n≤1,000,000,000
输出描述
对于每组数据,如果可以输出“Yes”,否则输出"No"。
输入样例
3 4 17 233
输出样例
Yes No Yes
题目大意:中文题目。
解题思路:直接枚举会超时,可以先把符合条件的数(斐波那契数列中可以被num整除,小于num),存在一个数组中,减少DFS的时间。
#include<stdio.h> #include<math.h> #include<string.h> long long fib[50], ans[50]; int num, flag, sum, cnt; int DFS(int n, int p) { if (n == 1) { flag = 1; return 1; } for (int i = p; i < cnt; i++) { if (n % ans[i] == 0 && DFS(n / ans[i], i)) { flag = 1; return 1; } } return 0; } int main() { fib[0] = 0; fib[1] = 1; for (int i = 2; i < 46; i++) { fib[i] = fib[i - 1] + fib[i - 2]; } int T; scanf("%d", &T); while (T--) { scanf("%d", &num); flag = cnt = 0; if (num == 0) { printf("Yes\n"); continue; } for (int i = 3; fib[i] <= num; i++) { if (num == fib[i]) { flag = 1; break; } if (num % fib[i] == 0) { ans[cnt++] = fib[i]; } } if (!flag) DFS(num, 0); if (flag) printf("Yes\n"); else printf("No\n"); } return 0; }
时间: 2024-10-18 19:46:47