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/ ...
随机推荐
- 微信支付接口调用问题(android正常,iphone调不起)
转自:http://blog.csdn.net/tt123123/article/details/53897035 碰到的问题 :根据微信提供的示例代码(ASP.NET),配置好一切后, 用andro ...
- 解决 iphone5 4 inch 屏 app黑边问题
你需要一张640*1138的预加载图(launch image).在工程>TARGETS 中添加,系统将自动将其重命名为Default-568h@2x.png.
- c语言程序设计案例教程(第2版)笔记(二)—函数、递归
零散知识点 模块化:将一个问题分解成若干个子问题的过程成为模块化. 模块化的优点:不但可以将一个复杂的问题分解成几个相对简单的问题:还可以提高程序代码的重用性. 函数:函数是构成C程序的基本单位.函数 ...
- [Usaco2006 Open]County Fair Events 参加节日庆祝
Description Farmer John has returned to the County Fair so he can attend the special events (concert ...
- hdu3436Queue-jumpers(线段树)
链接 这题最不好求的一部分是rank部分 因为top每次都是把一个数放在队头 不会穿插在数组里 也就是说后面没有top过的一部分数 依旧保持有序 这样可以分为两部分来处理 比如 1 2 3 4 5 6 ...
- AngularJS ng-repeat下使用ng-model
1 2 3 blue:<input type="radio" value="1" ng-model="selectValue"/> ...
- java jar文件打包成exe(Launch4j使用说明)
在日常的项目中需要把jar打包成exe.怎样快速的实现此功能.下面通过Launch4j的使用方法来介绍整个打包过程. 第一步:生成jar文件 第二部:使用Launch4j 图来描述过,简单明了.一切尽 ...
- R in action读书笔记(13)第十章 功效分析
功效分析 功效分析可以帮助在给定置信度的情况下,判断检测到给定效应值时所需的样本量.反过来,它也可以帮助你在给定置信度水平情况下,计算在某样本量内能检测到给定效应值的概率.如果概率低得难以接受,修改或 ...
- ES6语法糖集锦
sublime3安装Es6插件 javascriptNext,然后安装即可 JavaScriptNext - ES6 Syntax()高亮插件 -------------------------- ...
- 数组(Arry)几个常用方法的详解
join() 方法用于把数组中的所有元素放入一个字符串.元素是通过指定的分隔符进行分隔的. arrayObject.join(separator)separator 可选.指定要使用的分隔符.如果省略 ...