UVa 12333 - Revenge of Fibonacci manweifc(模拟加法竖式 & 字典树)
题意:
给定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(模拟加法竖式 & 字典树)的更多相关文章
- UVA - 12333 Revenge of Fibonacci 高精度加法 + 字典树
题目:给定一个长度为40的数字,问其是否在前100000项fibonacci数的前缀 因为是前缀,容易想到字典树,同时因为数字的长度只有40,所以我们只要把fib数的前40位加入字典树即可.这里主要讨 ...
- UVA 12333 Revenge of Fibonacci
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 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 ...
- UVa 12333 Revenge of Fibonacci (字典树+大数)
题意:给定一个长度小于40的序列,问你那是Fib数列的哪一项的前缀. 析:首先用大数把Fib数列的前100000-1项算出来,注意,一定不能是100000,要不然会WA的,然后每个数取前40位,不足4 ...
- pat(A) 2-06. 数列求和(模拟摆竖式相加)
1.链接:http://www.patest.cn/contests/ds/2-06 2.思路:模拟摆竖式相加,因为同样位置上的数字同样,那么同一位上的加法就能够用乘法来表示 3.代码: #inclu ...
- 校内模拟赛 : Rima —— 字典树+树形DP
首先说一下,对一个刚学Trie树的蒟蒻来说(就是我),这道题是一道好题.Trie树比较简单,所以就不详细写了. Rima 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传 ...
- hdu 4099 Revenge of Fibonacci Trie树与模拟数位加法
Revenge of Fibonacci 题意:给定fibonacci数列的前100000项的前n位(n<=40);问你这是fibonacci数列第几项的前缀?如若不在前100000项范围内,输 ...
- UVA-12333 Revenge of Fibonacci(竖式加法模拟 & 字典树)
题目: 给出一个斐波那契数字的前缀,问第一个有这个前缀的数字在斐波那契数列中是第几个. 思路: 紫书提示:本题有一定效率要求.如果高精度代码比较慢,可能会超时. 利用滚动数组和竖式加法来模拟斐波那契相 ...
- HDU4099 Revenge of Fibonacci(高精度+Trie)
Revenge of Fibonacci Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 204800/204800 K (Java/ ...
随机推荐
- 【原创】《从0开始学Elasticsearch》—初识Elasticsearch
目录 1. Elasticsearch 是什么2. Elasticsearch 中基本概念3. Elasticsearch 安装4. 访问 Elasticsearch 1. Elasticsearch ...
- Springboot整合elasticsearch以及接口开发
Springboot整合elasticsearch以及接口开发 搭建elasticsearch集群 搭建过程略(我这里用的是elasticsearch5.5.2版本) 写入测试数据 新建索引book( ...
- [ZOJ1961]Let it Bead
Description "Let it Bead" company is located upstairs at 700 Cannery Row in Monterey, CA. ...
- 洛谷 P3285 [SCOI2014]方伯伯的OJ
看到这题,第一眼:平衡树水题,随便做一做好了 然后....我在花了n个小时去调试(维护平衡树父节点)之后,... 调了三个小时后,第一次失败的代码(只能查找排名为k的用户编号,不能根据编号查排名) # ...
- 判素数+找规律 BestCoder Round #51 (div.2) 1001 Zball in Tina Town
题目传送门 /* 题意: 求(n-1)! mod n 数论:没啥意思,打个表能发现规律,但坑点是4时要特判! */ /***************************************** ...
- Tarjan UVALive 6511 Term Project
题目传送门 /* 题意:第i个人选择第a[i]个人,问组成强联通分量(自己连自己也算)外还有多少零散的人 有向图强联通分量-Tarjan算法:在模板上加一个num数组,记录每个连通分量的点数,若超过1 ...
- sed附加命令
追加命令(命令a) sed '[address] a the-line-to-append' input-file 在第二行后面追加一行(原文这里可能有问题,没有写名行号) [root@sishen ...
- [转]Windows Azure安全概述
本文转自:http://blogs.msdn.com/b/azchina/archive/2011/03/06/windows_5f00_azure_5f00_security_5f00_overvi ...
- C#_JDBC连接数据库
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 如何看Spring源码
想要深入的熟悉了解Spring源码,我觉得第一步就是要有一个能跑起来的极尽简单的框架,下面我就教大家搭建一个最简单的Spring框架,而且是基于Java Config形式的零配置Spring框架. 首 ...