HDU 4099 Revenge of Fibonacci(高精度+字典树)
题意:对给定前缀(长度不超过40),找到一个最小的n,使得Fibonacci(n)前缀与给定前缀相同,如果在[0,99999]内找不到解,输出-1。
思路:用高精度加法计算斐波那契数列,因为给定前缀长度不超过40,所以高精度计算时每次只需保留最高60位,每次将得到的值插入到字典树中,使得树上每个节点只保留最小的n值。查询输出字典树结点的值。
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXNLEN 80
#define LEN 60
using namespace std; struct bign
{
int d[MAXNLEN],len;
}; void add(bign & a,bign & b,bign & c)
{
c.len=max(a.len,b.len);
int carry=0;
for(int i=0;i<c.len;++i)
{
int now=carry+(i<a.len)*a.d[i]+(i<b.len)*b.d[i];
c.d[i]=now%10;
carry=now/10;
}
if(carry) c.d[c.len++]=1; if(c.len>LEN)
{
for(int i=0;i<LEN;++i) c.d[i]=c.d[i+1]; --c.len;
for(int i=0;i<LEN;++i) a.d[i]=a.d[i+1]; --a.len;
for(int i=0;i<LEN;++i) b.d[i]=b.d[i+1]; --b.len;
}
}
bign tmp[3]; #define maxnode 4100000
#define sigema_size 10
struct Trie
{
int ch[maxnode][sigema_size],val[maxnode],sz;
Trie() {sz=1;memset(ch[0],0,sizeof(ch[0]));memset(val,-1,sizeof(val));}
void insert(bign s,int v)
{
int u=0;
for(int i=s.len-1;i>=max(s.len-41,0);--i)
{
int c=s.d[i];
if(!ch[u][c])
{
memset(ch[sz],0,sizeof(ch[sz]));
if(val[sz]==-1) val[sz]=v;
ch[u][c]=sz++;
}
u=ch[u][c];
}
} int find(char *s)
{
int u=0;
for(int i=0;s[i];++i)
{
int c=s[i]-'0';
if(!ch[u][c]) return -1;
u=ch[u][c];
}
return val[u];
}
}trie; void init()
{
tmp[0].len=tmp[1].len=1,tmp[0].d[0]=tmp[1].d[0]=1;
trie.insert(tmp[1],0);
for(int i=2;i<100000;++i)
{
add(tmp[(i+2)%3],tmp[(i+1)%3],tmp[i%3]);
trie.insert(tmp[i%3],i);
}
}
int T,ca=0;
char st[MAXNLEN];
int main()
{
init();
scanf("%d",&T);
while(T--)
{
scanf("%s",st);
printf("Case #%d: %d\n",++ca,trie.find(st));
}
return 0;
}
HDU 4099 Revenge of Fibonacci(高精度+字典树)的更多相关文章
- hdu 4099 Revenge of Fibonacci 字典树+大数
将斐波那契的前100000个,每个的前40位都插入到字典树里(其他位数删掉),然后直接查询字典树就行. 此题坑点在于 1.字典树的深度不能太大,事实上,超过40在hdu就会MLE…… 2.若大数加法时 ...
- hdu 4099 Revenge of Fibonacci Trie树与模拟数位加法
Revenge of Fibonacci 题意:给定fibonacci数列的前100000项的前n位(n<=40);问你这是fibonacci数列第几项的前缀?如若不在前100000项范围内,输 ...
- HDU 4099 Revenge of Fibonacci Trie+高精度
Revenge of Fibonacci Problem Description The well-known Fibonacci sequence is defined as following: ...
- hdu 4099 Revenge of Fibonacci 大数+压位+trie
最近手感有点差,所以做点水题来锻炼一下信心. 下周的南京区域赛估计就是我的退役赛了,bless all. Revenge of Fibonacci Time Limit: 10000/5000 MS ...
- HDU 4099 Revenge of Fibonacci (数学+字典数)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4099 这个题目就是一个坑或. 题意:给你不超过40的一串数字,问你这串数字是Fibonacci多少的开头 ...
- UVA - 12333 Revenge of Fibonacci 高精度加法 + 字典树
题目:给定一个长度为40的数字,问其是否在前100000项fibonacci数的前缀 因为是前缀,容易想到字典树,同时因为数字的长度只有40,所以我们只要把fib数的前40位加入字典树即可.这里主要讨 ...
- HDU 4557 Tree(可持久化字典树 + LCA)
http://acm.hdu.edu.cn/showproblem.php?pid=4757 题意: 给出一棵树,每个结点有一个权值,现在有多个询问,每次询问包含x,y,z三个数,求出在x到y的路径上 ...
- HDU 4825 Xor Sum(01字典树入门题)
http://acm.hdu.edu.cn/showproblem.php?pid=4825 题意: 给出一些数,然后给出多个询问,每个询问要从之前给出的数中选择异或起来后值最大的数. 思路:将给出的 ...
- HDU 1247 Hat’s Words(字典树)
http://acm.hdu.edu.cn/showproblem.php?pid=1247 题意: 给出一些单词,问哪些单词可以正好由其他的两个单词首尾相连而成. 思路: 先将所有单独插入字典树,然 ...
随机推荐
- std::vector数据复制
std::vector<boost::shared_ptr <ITEM> > srcItemList; // 数据源 std::vector<ITEM> des ...
- sysstat的基本用法
sysstat是一个软件包,包含监测系统性能及效率的一组工具,这些工具对于我们收集系统性能数据,比如CPU使用率.硬盘和网络吞吐数据,这些数据的收集和分析,有利于我们判断系统是否正常运行,是提高系统运 ...
- LR之配置端口映射(port mapping)
1.那些协议需要配置 tools-recording_options-network-port mapping 2.定义端口映射 3.自动检测原理 4.特殊情况
- python中的静态方法和类方法
在python中,各种方法的定义如下所示: class MyClass(object): #在类中定义普通方法,在定义普通方法的时候,必须添加self def foo(self,x): print & ...
- python字典概述
字典 1. 概述 字典是一个无序的数据集合,序列类型用有序的数字键做索引将数据以数组的形式存储. 在字典中能获得的有序集合只能是键的集合或者是值得集合,方法keys()或者value()返回一个 ...
- leetcode:Roman to Integer(罗马数字转化为罗马数字)
Question: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the rang ...
- MarkdownPad 破解学习
最近学习 Markdown,从网上下载了 Windows 下的编辑器:MarkdownPad.这款软件分为免费版和专业版(收费), 对于普通用户来说免费版已经足够,专业版比免费版多了如下几个功能: 一 ...
- Python 多线程学习(转)
转自:http://www.cnblogs.com/slider/archive/2012/06/20/2556256.html 引言 对于 Python 来说,并不缺少并发选项,其标准库中包括了对线 ...
- (转)android中利用 ViewPage 实现滑动屏
最近实现了这样的一个效果:滑动界面出现拖拽效果,可翻动3屏,也可点击按钮翻动页面. 主要利用android.support.v4.view.ViewPager控件来实现. 第一个界面: 滑动屏幕: 换 ...
- Linux系统下查看已经登录用户并踢出的方法
LINUX是个多用户系统,一旦连接到网络中,它可以同时为多个登录用户提供服务. 查看用户的操作 查看当前用户: [ROOT@LOCALHOST ROOT] # W ...