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 题意: 给出一些单词,问哪些单词可以正好由其他的两个单词首尾相连而成. 思路: 先将所有单独插入字典树,然 ...
随机推荐
- 存储过程中使用事务与try catch
一.存储过程中使用事务的简单语法 在存储过程中使用事务时非常重要的,使用数据可以保持数据的关联完整性,在Sql server存储过程中使用事务也很简单,用一个例子来说明它的语法格式: 代码 : ) ) ...
- 从SVN导出指定版本号之间修改的文件(转)
从SVN导出指定版本号之间修改的文件(转) 当一个网站项目进入运营维护阶段以后,不会再频繁地更新全部源文件到服务器,这个时间的修改大多是局部的,因此更新文件只需更新修改过的文件,其他没有修改过的文 ...
- kali工具学习
使用前的准备 开启/关闭 HTTP服务 Service apache2 start/stop 自动启动HTTP服务:update-rc.d apache2 defaults 开启/关闭 mysql S ...
- VS常用技巧
VS2005代码编辑器的展开和折叠代码确实很方便和实用.以下是展开代码和折叠代码所用到的快捷键,很常用: Ctrl + M + O: 折叠所有方法 Ctrl + M + M: 折叠或者展开当前方法 C ...
- MVC同一页面循环显示数据库记录(答题/投票系统)
) { //int id = 1; list newlist = db.lists.Find(id); //var q = from p in db.lists where p.id==1 selec ...
- Hive常用命令
本位为转载,原地址为:http://www.cnblogs.com/BlueBreeze/p/4232421.html #创建新表 hive> CREATE TABLE t_hive (a in ...
- Ios下解决libzbar.a不支持armv7s的方法
解决 libzbar.a' for architecture armv7 的问题 下载最新的zbar源码 http://sourceforge.net/p/zbar/code/ci/default/t ...
- 数据结构 -- 简单图的实现与遍历 (Java)
---恢复内容开始--- 作者版权所有,转载请注明出处,多谢. http://www.cnblogs.com/Henvealf/p/5534071.html 前些天因为某些原因,就试着回想一下图(gr ...
- CameraComponent Quality
CameraComponent1.Quality := TVideoCaptureQuality.HighQuality; procedure TCameraComponentForm.Set720p ...
- Matlab 图像画在坐标轴下
>> x=linspace(,*pi,); >> y=sin(x); >> figure;plot(x,y,'r-') >> set(gca,'xaxi ...