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 num[50];
10 map<LL, bool> m;
11 void init()
12 {
13     queue<LL> q;
14     m[0] = true;
15     m[1] = true;
16     num[0] = 0;
17     num[1] = 1;
18     for (int i = 2; i < 46; i++)
19     {
20         num[i] = num[i - 1] + num[i - 2];
21         q.push(num[i]);
22         m[ num[i] ] = true;
23     }
24     while (!q.empty())
25     {
26         int temp =  q.front();
27         q.pop();
28         for (int i = 1; i < 46; i++)
29         {
30             LL res = temp * num[i];
31             if (res > Max)
32                 break;
33             if (m[ res ])
34                 continue;
35             m[ res ] = true;
36             q.push(res);
37         }
38     }
39
40 }
41 int main()
42 {
43     init();
44     int test, n;
45     scanf("%d", &test);
46     while (test--)
47     {
48         scanf("%d", &n);
49         if (m[ n ])
50             printf("Yes\n");
51         else
52             printf("No\n");
53     }
54     return 0;
55 }

时间: 2024-11-02 19:17:49

HDU 5167(map + 暴力)的相关文章

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(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 1247 map的使用

http://acm.hdu.edu.cn/showproblem.php?pid=1247 Hat’s Words Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7760    Accepted Submission(s): 2814 Problem Description A hat’s word is a word in the

hdu 4941 map的应用+离散

1 #include<iostream> 2 #include<cstdio> 3 #include<map> 4 #include<algorithm> 5 using namespace std; 6 7 int main() 8 { 9 int T,n,m,k,a,b,c,q,cas=1; 10 scanf("%d",&T); 11 while(T--) 12 { 13 map<int,map<int,int&g

hdu 4876(剪枝+暴力)

题意:给定n,k,l,接下来给出n个数,让你从n个数中选取k个数围成一圈,然后从这k个数中随意选出连续的m(m>=1&&m<=k)个数进行异或后得到[l,r]区间的所有值,让你求最大的r. 分析:关键问题是需要剪枝! 代码实现: #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #inclu

HDU 4287 &lt;map&gt;的使用

对于这道题我主要要讲得是STL中map的简单使用. 先说说map的用处. map就是从键(key)到值(value)的映射.因为重载了[]运算符,map像数组的"高级版",例如可以用一个map<string,int>month_name来表示"月份名字到月份编号"的映射,然后用month_name["July"] = 7这样的方式来赋值. 它的意思就是map<string,int>month_name表示[ ] 里面代表的

hdu 4499 Cannon(暴力)

题目链接:hdu 4499 Cannon 题目大意:给出一个n*m的棋盘,上面已经存在了k个棋子,给出棋子的位置,然后求能够在这种棋盘上放多少个炮,要求后放置上去的炮相互之间不能攻击. 解题思路:枚举行放的情况,用二进制数表示,每次放之前推断能否放下(会不会和已经存在的棋子冲突),放下后推断会不会互相攻击的炮,仅仅须要对每一个新加入的炮考虑左边以及上边就能够了. #include <cstdio> #include <cstring> #include <algorithm&

HDU 4921 Map DFS+状态压缩+乘法计数

算最多十条链,能截取某前缀段,每种方案都可以算出一个权值,每种方案的概率都是总数分之一,问最后能构成的所有可能方案数. 对计数原理不太敏感,知道是DFS先把链求出来,但是想怎么统计方案的时候想了好久,其实因为只能取某个链的前缀,所以直接取链长加+1 然后相乘即可,当然因为会出现都是空的那种情况,要去掉,全部乘完之后,要-1 然后就是算权值了,权值等于当前加进来的点的总和 以及 等级相同的点的加成,并不是特别好算,这时候考虑每个状态下的点对全局的贡献,对,就是这个思想,用状态压缩来表示状态,然后这

HDU 1075 map or 字典树

What Are You Talking About Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/204800 K (Java/Others)Total Submission(s): 12773    Accepted Submission(s): 4069 Problem Description Ignatius is so lucky that he met a Martian yesterday. But