题目:http://acm.hdu.edu.cn/showproblem.php?pid=1250

思路:本题的Fibonacci数列是扩展的四阶的Fibonacci数列,用递推关系式求解即可.

题目提示,所求的Fibonacci数最多2500位,所以不能用已有的数据类型表示,可以采用数组存储数字,模拟加法.

由于没有给F(n)的n最大为多少,所以需要估计一下.经过反复测试,F(7000)约为2000位左右,如果设置数组长度为2500+1,则计算得到F(7500)的结果沾满了2500+1位(),所以我们只需要计算到n=7500即可.

在写代码的时候设置一个数组a[7500][2500+1],则a[i][j]表示待求的F(i)的i的2500+1位中的第j位.

C++代码如下:

#include<iostream>
#include<string.h>
using namespace std; #define maxn 7500//最多算到
#define len 2500 + 1 //最多2500+1位
int a[maxn][len]; int main()
{
int i,j;
for(i=1;i<maxn;i++)//所有的a[i]的每一位初始化为0
memset(a[i],0,sizeof(a[i])); a[1][len-1] = a[2][len-1] = a[3][len-1] = a[4][len-1] = 1;//F(1)F(2)F(3)F(4)都为1 for(i=5;i<maxn;i++)//从5开始
{
int c = 0;
for(j=len-1;j>=0;j--)//计算F(i)
{
c += + a[i-1][j] + a[i-2][j] + a[i-3][j] + a[i-4][j] ;
a[i][j] = c % 10;
c = c / 10;
}
} int n;
while(cin>>n)
{
for(i=0;i<len;i++)
if(a[n][i])
break;//去掉前导0
for(j=i;j<len;j++)
cout << a[n][j];
cout << endl;
}
return 0;
}

上述代码,提交无法通过,显示MLE.

上述代码中a[i]的每一个元素仅存储一位数,可以用a[i]的每一个元素存多位数,例如存4位,则2500位需要625个元素存储.所以数组a可以定义为a[7500][625].如下图:

两种存储方式的每一位都是int型的,所以第二种更节省空间,也更节省时间.采用这种方式可以避免第一种存储方式所产生的TLE或者MLE.

C++代码如下:

#include<iostream>
#include<string.h>
using namespace std; #define maxn 7500
#define len 625 //每个元素可以存 4 位,一共要存2500位,一共需要 625个数组元素.
int a[maxn][len]; int main()
{
int i,j; for(i=1;i<maxn;i++)//一些初始化工作
memset(a[i],0,sizeof(a[i]));
a[1][len-1] = a[2][len-1] = a[3][len-1] = a[4][len-1] = 1; for(i=5;i<maxn;i++)//从5开始
{
int c = 0;
for(j=len-1;j>=0;j--)//计算F(i)
{
c += (a[i-1][j] + a[i-2][j] + a[i-3][j] + a[i-4][j]);
a[i][j] = c % 10000;//进位处理:不是10,不是1000,因为9999仍然是四位数,只有到了10000才能进位
c /= 10000;
}
} int n;
while(scanf("%d",&n)!=EOF)
{
if(n<=4)
printf("%s\n","1");
else
{
int i,j;
for(i=0;i<len;i++)
if(a[n][i])
break; printf("%d",a[n][i]);//先输出第一个[四位数],这样输入默认去掉前导0.
for(j=i+1;j<len;j++)//以后输入的中间0要保留.
printf("%04d",a[n][j]);//注意此处输出格式 "%04d".
printf("\n");
}
} return 0;
}

上述代码,提交可以通过.

小结:

1.由于每个元素存储4位,所以在输出的时候,除了首位的前面的0要去掉以外,后面的位的0必须保留.

例如:输出[0023][0208][1205][0001].

错误:printf("%d",a[n][j]);输出结果:2320812051

正确:先输出[0023],前面的00去掉,即:printf("%d",a[n[0]]);再输出后面,有前导0的要保留即:printf("%04d",a[n][j]);(j>=1)输出结果:23020812050001

2.采用【一个数组元素存储4位】相当于采用了10000进制,也可以采用【一个数组元素存储8位】的方法,相当于是100000000进制,那么在输出的时候也要用printf("%08d",a[n][j]);的方法.

参考:

http://blog.csdn.net/vsooda/article/details/7985496

http://blog.csdn.net/zwj1452267376/article/details/47132583

【hdoj_1250】Hat's Fibonacci(大数)的更多相关文章

  1. HDOJ/HDU 1250 Hat's Fibonacci(大数~斐波拉契)

    Problem Description A Fibonacci sequence is calculated by adding the previous two members the sequen ...

  2. Hat's Fibonacci(大数,好)

    Hat's Fibonacci Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  3. Hat's Fibonacci(大数加法+直接暴力)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1250 hdu1250: Hat's Fibonacci Time Limit: 2000/1000 M ...

  4. HDU 1250 Hat's Fibonacci(大数相加)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1250 Hat's Fibonacci Time Limit: 2000/1000 MS (Java/Ot ...

  5. HDU 1250 Hat's Fibonacci (递推、大数加法、string)

    Hat's Fibonacci Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  6. hdu 1250 Hat's Fibonacci

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1250 Hat's Fibonacci Description A Fibonacci sequence ...

  7. HDUOJ----1250 Hat's Fibonacci

    Hat's Fibonacci Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  8. (二维数组 亿进制 或 滚动数组) Hat's Fibonacci hdu1250

    Hat's Fibonacci Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  9. hdu 1250 Hat's Fibonacci(java,简单,大数)

    题目 java做大数的题,真的是神器,来一道,秒一道~~~ import java.io.*; import java.util.*; import java.math.*; public class ...

随机推荐

  1. Zookeeper(四)Hadoop HA高可用集群搭建

    一.高可就集群搭建 1.集群规划 2.集群服务器准备 (1) 修改主机名(2) 修改 IP 地址(3) 添加主机名和 IP 映射(4) 同步服务器时间(5) 关闭防火墙(6) 配置免密登录(7) 安装 ...

  2. 解题:ZJOI 2014 力

    题面 事实说明只会FFT板子是没有用的,还要把式子推成能用FFT/转化一下卷积的方式 虽然这个题不算难的多项式卷积 稍微化简一下可以发现实际是$q_i$和$\frac{1}{(i-j)^2}$在卷,然 ...

  3. centos7安装python-pip(转)

    好久没更新博客了............. 来一发................ 在使用centos7的软件包管理程序yum安装python-pip的时候会报一下错误: No package pyt ...

  4. 2018-2019 ACM-ICPC 焦作赛区 部分题解

    题目链接:https://codeforces.com/gym/102028 B. Ultraman vs. Aodzilla and Bodzilla 题意: 两只怪兽,它们的生命和攻击分别为hpA ...

  5. Chiaki Sequence Revisited HDU - 6304 lowbit找规律法

    Problem Description Chiaki is interested in an infinite sequence a1,a2,a3,..., which is defined as f ...

  6. libuv在mingw下编译

    libuv是一个基于事件的异步IO库,来自node.js项目. libuv提供了Makefile.mingw,供MingW编译,由其中的规则我们可以得到一下编译步骤: cd libuv/src gcc ...

  7. angularJs 跨控制器与跨页面传值

    虽然网上概括了四种或更多的传值方式,但我现在用的顺手的就两种 首先要知道AngularJs可以构建一个单页面应用程序,所以我划分为跨控制器传值 和 跨页面传值 两类 1.跨控制器传值—— $rootS ...

  8. hbase性能调优案例

    hbase性能调优案例 1.人员-角色   人员有多个角色  角色优先级   角色有多个人员   人员 删除添加角色   角色 可以添加删除人员   人员 角色 删除添加   设计思路 person表 ...

  9. LintCode 190: Next Permutation

    LintCode 190: Next Permutation 题目描述 给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列. 如果没有下一个排列,则输出字典序最小的序列. 样例 ...

  10. 【BZOJ】3527: [Zjoi2014]力 FFT

    [参考]「ZJOI2014」力 - FFT by menci [算法]FFT处理卷积 [题解]将式子代入后,化为Ej=Aj-Bj. Aj=Σqi*[1/(i-j)^2],i=1~j-1. 令f(i)= ...