题意:

给定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. [POI2008]BLO-Blockade 【无向图tarjan/鸽点】By cellur925

    题目传送门 lyd无向图tarjan的例题. 一句话题意(不得不佩服lyd老师的高度概括能力):在一张无向连通图上,求出每个点被破坏(去掉与这个点相关的所有边,不去掉这个点)后,无向图中使i,j不连通 ...

  2. 《Windows核心编程系列》二十谈谈DLL高级技术

    本篇文章将介绍DLL显式链接的过程和模块基地址重定位及模块绑定的技术. 第一种将DLL映射到进程地址空间的方式是直接在源代码中引用DLL中所包含的函数或是变量,DLL在程序运行后由加载程序隐式的载入, ...

  3. 安卓Activity全屏显示以及不显示title

    1.让Activity全局显示,使系统的导航栏变为透明: (1)可以在Activity代码中添加window属性: if(VERSION.SDK_INT >= VERSION_CODES.KIT ...

  4. [Usaco2009 Feb]庙会捷运Fair Shuttle

    Description 公交车一共经过N(1<=N<=20000)个站点,从站点1一直驶到站点N.K(1<=K<=50000)群奶牛希望搭乘这辆公交车.第i群牛一共有Mi(1& ...

  5. Rsync 12种故障排查及思路

    Rsync 故障排查整理 Rsync服务常见问题汇总讲解: ====================================================================== ...

  6. webapp开发学习---Cordova目录结构分析及一些概念

      Config.xml是一个全局配置文件,用于控制cordova应用程序行为的许多方面. 这个不依赖于平台的XML文件是基于W3C的“打包Web应用程序(Widget)”规范进行安排的,并扩展到指定 ...

  7. ES3之bind方法的实现模拟

    扩展Function原型方法,此处用myBind来模拟bind实现 Function.prototype.myBind = function(o /*,args*/){       //闭包无法获取t ...

  8. 行内元素对齐各种问题--从line-height和vertical-align的角度分析

    最近研究行内元素的对齐问题,发现img不管怎么设置,下边都有一块留白,强迫症无法忍受未知,于是开始了查阅探索之旅. 辗转来到张鑫旭的博客,他对行内盒子模型做了详细的介绍,包括“幽灵节点”,“line- ...

  9. Android开源项目:GifView——Android显示GIF动画

    下载:http://code.google.com/p/gifview/downloads/list 简介:android中现在没有直接显示gif的view,只能通过mediaplay来显示,且还常常 ...

  10. iOS Programming Web Services and UIWebView

    iOS Programming Web Services and UIWebView The work is divided into two parts. The first is connecti ...