HDU 4099 字典树+高精度

简介:

题意:给出某项斐波那契数的前几位,让输出最小的一项前缀为这个串的项数。

先高精度算出前100000项斐波那契的前50位。并把前40位存进字典树预处理一下。字典树节点值存为第几项。然后输入字符串直接查找。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 50
int fib[3][N+1];
class trie
{
public:
    trie* next[10];
    int value;
    trie()
    {
        for(int i=0; i<10; i++)
            next[i]=0;
        value=-1;
    }
} root,*a;
void insert(trie* p,int* s,int n,int len)
{
    p=&root;
    int k=len;
    while(k>=0&&len-k<=40)
    {
        if(!p->next[s[k]])
            p->next[s[k]]=new trie;
        p=p->next[s[k]];
        if(p->value==-1)
            p->value=n;
        k--;
    }
}
int find(trie* p,char* s)
{
    p=&root;
    int k=0,ans;
    while(s[k]!='\0')
    {
        if(!p->next[s[k]-'0'])
            return -1;
        p=p->next[s[k]-'0'];
        k++;
    }
    return p->value;
}
void init()
{
    memset(fib,0,sizeof(fib));
    char str[45];
    fib[0][0]=1;
    fib[1][0]=1;
    insert(a,fib[0],0,0);
    int i,j;
    for(i=2; i<100000; i++)
    {
        int c=0;
        for(j=0; j<=N; j++)
        {
            fib[2][j]=(c+fib[1][j]+fib[0][j])%10;
            c=(c+fib[1][j]+fib[0][j])/10;
        }
        if(j==N+1&&c>0)
        {
            for(int t=0; t<N; t++)
            {
                fib[0][t]=fib[1][t+1];
                fib[1][t]=fib[2][t+1];
            }
            fib[0][N]=0;
            fib[1][N]=c;
        }
        else
        {
            for(int t=0; t<=N; t++)
            {
                fib[0][t]=fib[1][t];
                fib[1][t]=fib[2][t];
            }
        }
        int t;
        for(t=N; t>=0; t--)
            if(fib[1][t]) break;
        insert(a,fib[1],i,t);
    }
}
int main()
{
    init();
    char temp[45];
    int t,ca=0;
    scanf("%d",&t);
    while(t--)
        scanf("%s",temp),
        printf("Case #%d: %d\n",++ca,find(a,temp));
    return 0;
}


目录
相关文章
|
5月前
|
存储
【洛谷 P1255】数楼梯 题解(递归+记忆化搜索+高精度)
这是一个使用动态规划解决的“数楼梯”问题。给定楼梯数`N`,求不同上楼方式的数量。程序通过递归函数`f()`计算,其中`f(x) = f(x - 1) + f(x - 2)`,初始条件`f(1) = 1`,`f(2) = 2`。考虑到数据规模可能很大,使用了高精度加法运算。样例输入`4`,输出`5`。代码中定义了一个存储中间结果的向量`mem`,并提供了一个用于显示高精度数的`printv()`函数。
75 0
|
5月前
|
存储
【洛谷 P2437】蜜蜂路线 题解(递归+记忆化搜索+高精度)
蜜蜂路线问题:蜜蜂从蜂房$m$到$n$($m&lt;n$)按数字递增爬行。给定$m$和$n$,求路线数。示例:$m=1$,$n=14$,输出$377$。100%数据$1\leq m,n\leq1000$。使用斐波那契序列优化,高精度处理大数。代码实现斐波那契存储并动态规划求解。
80 0
|
5月前
|
C++
【洛谷 P1601】A+B Problem(高精)题解(高精度+向量)
该问题要求解决高精度加法(正数)的A+B问题。给定两个不超过10^500的大整数a和b,程序需输出它们的和。样例输入包括两个整数,如1和1,输出为2;另一样例是1001和9099,输出为10100。解决方案通过模拟十进制加法实现,代码使用C++,将输入转换为字符数组,然后逐位相加并处理进位。最终结果反向输出。
51 0
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第3期】回溯问题系列:单词搜索、N皇后问题、判断有效数独、解数独
【经典LeetCode算法题目专栏分类】【第3期】回溯问题系列:单词搜索、N皇后问题、判断有效数独、解数独
|
6月前
【每日一题Day218】LC1091 二进制矩阵中的最短路径 | BFS
【每日一题Day218】LC1091 二进制矩阵中的最短路径 | BFS
32 0
|
算法 C++
剑指offer(C++)-JZ38:字符串的排列(算法-搜索算法)
剑指offer(C++)-JZ38:字符串的排列(算法-搜索算法)
|
算法 定位技术 Perl
|
算法 C++ Python
BFS逛街算法模板-附LeetCode习题-433. 最小基因变化-广度优先搜索
BFS逛街算法模板-附LeetCode习题-433. 最小基因变化-广度优先搜索