题意:

给定n个(n<=40)数字, 求100000个以内有没有前面n个数字符合给定的数字的fibonacci项, 如果有, 给出最小的fibonacci项, 如果没有, 输出-1。

分析:

可以将这个问题分为两个部分:

①求出10万个fibonacci数列的前40个数字

②查找给定的数在不在这些数字里面

对于第一个部分, 我们可以模拟竖式加法(可以用滚动数组节省内存), 然后因为只是需要前40位,而且fibonacci数列上升速度很快, 所以我们保留60位的精度就足够了。

对于第二部分,可以构造字典树,用数组模拟可以避免指针带来的不必要出错。

#include <bits/stdc++.h>
using namespace std;
struct Node
{
int id;
int next[];
Node(){
id = -;
for(int i = ; i < ; i++)
{
next[i] = -;
}
}
};
Node trie[];
int cnt = ;
const Node root = trie[cnt++];
void add_node(const char str[], int id)
{
int index = ;
for(int i = , len = strlen(str); i < len; i++)
{
int v = str[i] - '';
if((trie[index].next[v] == -))
{
trie[index].next[v] = cnt;
index = cnt;
cnt++;
}
else {
index = trie[index].next[v];//如果存在直接去到下一个节点
}
if(trie[index].id == -){
trie[index].id = id;
}
} }
int Find(const char str[])
{
int index = ;
for(int i = , len = strlen(str); i < len; i++)
{ int v = str[i] - '';
if(v < ) return -;
if(trie[index].next[v] == -)
{
return -;
}
index = trie[index].next[v];
}
return trie[index].id;
}
int main()
{
char t[];
memset(t,,sizeof(t));
int fib[][];
add_node((char*)"",);
int p, q, s, l;
s = ; l = ;
fib[][] = ;
fib[][] = ;
for(int f = ; f < ; f++){
p = f&, q = (f+) &; //滚动数组
for(int i = s; i < l; i++){
fib[p][i] = fib[p][i] + fib[q][i];
if(fib[p][i] >= ){
fib[p][i+]++;
fib[p][i] -= ;//进位了记得要减回来
if(i == l-){
l++;//如果最后一位还要进位 那么位数+1
}
}
}
if(l - s > ) s++;//保留前60位的精度
int cnt = ;
for(int i = l - ; i >= s && cnt < ; i--)
{
t[l-i-] = fib[p][i]+'';
cnt++;
}
add_node((char*)t,f);//截取前40个数字构造字典树
memset(t,,sizeof(t));
}
int tt;
scanf("%d", &tt);
int kase = ;
char que[];
while(tt--)
{
scanf("%s", que);
printf("Case #%d: %d\n",kase++, Find(que));
}
}

UVa 12333 - Revenge of Fibonacci manweifc(模拟加法竖式 & 字典树)的更多相关文章

  1. UVA - 12333 Revenge of Fibonacci 高精度加法 + 字典树

    题目:给定一个长度为40的数字,问其是否在前100000项fibonacci数的前缀 因为是前缀,容易想到字典树,同时因为数字的长度只有40,所以我们只要把fib数的前40位加入字典树即可.这里主要讨 ...

  2. UVA 12333 Revenge of Fibonacci

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. UVA - 12333 Revenge of Fibonacci (大数 字典树)

    The well-known Fibonacci sequence is defined as following: F(0) = F(1) = 1 F(n) = F(n − 1) + F(n − 2 ...

  4. UVa 12333 Revenge of Fibonacci (字典树+大数)

    题意:给定一个长度小于40的序列,问你那是Fib数列的哪一项的前缀. 析:首先用大数把Fib数列的前100000-1项算出来,注意,一定不能是100000,要不然会WA的,然后每个数取前40位,不足4 ...

  5. pat(A) 2-06. 数列求和(模拟摆竖式相加)

    1.链接:http://www.patest.cn/contests/ds/2-06 2.思路:模拟摆竖式相加,因为同样位置上的数字同样,那么同一位上的加法就能够用乘法来表示 3.代码: #inclu ...

  6. 校内模拟赛 : Rima —— 字典树+树形DP

    首先说一下,对一个刚学Trie树的蒟蒻来说(就是我),这道题是一道好题.Trie树比较简单,所以就不详细写了. Rima 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传 ...

  7. hdu 4099 Revenge of Fibonacci Trie树与模拟数位加法

    Revenge of Fibonacci 题意:给定fibonacci数列的前100000项的前n位(n<=40);问你这是fibonacci数列第几项的前缀?如若不在前100000项范围内,输 ...

  8. UVA-12333 Revenge of Fibonacci(竖式加法模拟 & 字典树)

    题目: 给出一个斐波那契数字的前缀,问第一个有这个前缀的数字在斐波那契数列中是第几个. 思路: 紫书提示:本题有一定效率要求.如果高精度代码比较慢,可能会超时. 利用滚动数组和竖式加法来模拟斐波那契相 ...

  9. HDU4099 Revenge of Fibonacci(高精度+Trie)

    Revenge of Fibonacci Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 204800/204800 K (Java/ ...

随机推荐

  1. DFS(深度) hihoCoder挑战赛14 B 赛车

    题目传送门 题意:中文题面 分析:放官方题解,就是从1为根节点深搜记录节点的深度,选出最大的深度的点,将该到达该点的节点都vis掉,然后再重新计算没有vis的点的深度,找最大的相加就是答案.放张图好理 ...

  2. 找规律 Codeforces Round #309 (Div. 2) A. Kyoya and Photobooks

    题目传送门 /* 找规律,水 */ #include <cstdio> #include <iostream> #include <algorithm> #incl ...

  3. C# PropertyInfo(官网)

    using System; using System.Reflection; class Module1 { public static void Main() { // This variable ...

  4. 转】Neo4j集群安装实践

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/2/ 感谢! Posted: Oct 29, 2013 Ta ...

  5. NBA15-16赛季半程有感

    2015-2016 新赛季NBA已经开打半程又多了,这半个赛季我们见证了 勇士的三节打卡:骑士的磨合反复:马刺的老骥伏枥: 当然还有窝火的XJBD. 豪哥200W刀签约黄蜂,打出来800W刀的身价,无 ...

  6. redis 远程连接方法

    解决方法 1.修改redis服务器的配置文件 vi redis.conf 注释以下绑定的主机地址 # bind 127.0.0.1 或 vim  redis.conf bind  0.0.0.0 pr ...

  7. 正则表达式 - IP地址、Mac地址、端口、经纬度、车牌号码校验

    IP地址验证:   /^(\d|[1-9]\d|1\d{2}|2[0-5][0-5])\.(\d|[1-9]\d|1\d{2}|2[0-5][0-5])\.(\d|[1-9]\d|1\d{2}|2[0 ...

  8. "CSRF token missing or incorrect."的解决方法.

    现象: Forbidden (403)CSRF verification failed. Request aborted.HelpReason given for failure:CSRF token ...

  9. Java语法基础-static关键字

    static关键字说明 “static方法就是没有this的方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法.这 ...

  10. php高效率对一维数组进行去重

    $input = array("a" => "green", "red", "b" => "gre ...