HDU 5167

范围 内的斐波那契的数不多,求出范围内的数,再暴力枚举即可。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
#define  N 1000000000
__int64 foci[200];
int fc=0,cnt;
__int64 tmp[50];

void init(){
	foci[0]=0; foci[1]=1;
	fc=1;
	for(fc=2;foci[fc-1]<=N;fc++){
		foci[fc]=foci[fc-1]+foci[fc-2];
	//	cout<<foci[fc]<<endl;
	}
	fc=fc-1;
}

bool dfs(__int64 n,int pos){
	if(n==1LL) return true;
	for(int i=pos;i<=cnt;i++){
		if(n%tmp[i]==0&&dfs(n/tmp[i],i))
		return true;
	}
	return false;
}

int main(){
	init();
	int T,i;
	__int64 n;
	scanf("%d",&T);
	while(T--){
		scanf("%I64d",&n);
		if(n==0||n==1LL){
			printf("Yes\n");
			continue;
		}
		i=3; cnt=0;
		for(i;i<=fc;i++){
			if(n%foci[i]==0)
			tmp[++cnt]=foci[i];
		}
		bool flag=dfs(n,1);
		if(flag)
		printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}

  

时间: 2024-11-01 01:03:05

HDU 5167的相关文章

hdu 5167 Fibonacci(DFS)

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 输出样例

hdu 5167 Fibonacci

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5167 题意: fi[0]=0,fi[1]=1 fi[i]=fi[i-1]+fi[i-2] i>1 给出一个数n,问这个数能不能有fi[]相乘得来. 限制: 0 <= n <= 1e9 思路: 1e9以内的斐波那契数只有44个,用记忆化搜索可以解决这道题. C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

hdu 5167 Fibonacci(预处理)

Problem Description Following is the recursive definition of Fibonacci sequence: Fi=???01Fi−1+Fi−2i = 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 sh

hdu 5167 bfs

因为斐波那契数列增长很快(指数级),所以10Y以内只有不到50个斐波那契数,将这些数字所有可能的乘积存起来查询即可,这里采用bfs+set的方式. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <queue> 5 #include <set> 6 using namespace std; 7 8 typedef long long ll; 9 c

HDU 5167 Fibonacci(BestCoder Round #28)

Problem Description: Following is the recursive definition of Fibonacci sequence: Fi=???01Fi−1+Fi−2i = 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 

HDU 5167(map + 暴力)

题意:给出一个数n,问n能否是斐波那契数列中数的乘积 先刷选 斐波那契数列,然后就枚举 1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <map> 5 #include <iostream> 6 using namespace std; 7 typedef long long LL; 8 const LL Max = 1000000000; 9 LL n

HDU - 5166 - Missing number &amp;&amp; 5167 - Fibonacci

Missing number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 430    Accepted Submission(s): 233 Problem Description There is a permutation without two numbers in it, and now you know what num

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include