题意:

给定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. 【原创】《从0开始学Elasticsearch》—初识Elasticsearch

    目录 1. Elasticsearch 是什么2. Elasticsearch 中基本概念3. Elasticsearch 安装4. 访问 Elasticsearch 1. Elasticsearch ...

  2. Springboot整合elasticsearch以及接口开发

    Springboot整合elasticsearch以及接口开发 搭建elasticsearch集群 搭建过程略(我这里用的是elasticsearch5.5.2版本) 写入测试数据 新建索引book( ...

  3. [ZOJ1961]Let it Bead

    Description "Let it Bead" company is located upstairs at 700 Cannery Row in Monterey, CA. ...

  4. 洛谷 P3285 [SCOI2014]方伯伯的OJ

    看到这题,第一眼:平衡树水题,随便做一做好了 然后....我在花了n个小时去调试(维护平衡树父节点)之后,... 调了三个小时后,第一次失败的代码(只能查找排名为k的用户编号,不能根据编号查排名) # ...

  5. 判素数+找规律 BestCoder Round #51 (div.2) 1001 Zball in Tina Town

    题目传送门 /* 题意: 求(n-1)! mod n 数论:没啥意思,打个表能发现规律,但坑点是4时要特判! */ /***************************************** ...

  6. Tarjan UVALive 6511 Term Project

    题目传送门 /* 题意:第i个人选择第a[i]个人,问组成强联通分量(自己连自己也算)外还有多少零散的人 有向图强联通分量-Tarjan算法:在模板上加一个num数组,记录每个连通分量的点数,若超过1 ...

  7. sed附加命令

    追加命令(命令a) sed '[address] a the-line-to-append' input-file 在第二行后面追加一行(原文这里可能有问题,没有写名行号) [root@sishen ...

  8. [转]Windows Azure安全概述

    本文转自:http://blogs.msdn.com/b/azchina/archive/2011/03/06/windows_5f00_azure_5f00_security_5f00_overvi ...

  9. C#_JDBC连接数据库

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. 如何看Spring源码

    想要深入的熟悉了解Spring源码,我觉得第一步就是要有一个能跑起来的极尽简单的框架,下面我就教大家搭建一个最简单的Spring框架,而且是基于Java Config形式的零配置Spring框架. 首 ...