HDU3117
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3117
题目大意:对于给定的一个数 n ,求斐波那契数F(n)。对于超过八位的数,给出首末四位即可。
解题思路:
首先,由题目给出的样例易知,当n<40,F(n)不超过八位,这部分用个循环直接打表求出即可。
当n>=40,对于后四位,我们可以用矩阵快速幂算法,利用公式:
来求解,记得模10000即可。而对于前四位......这个的数学要求就有点高了......请看:

图源:http://www.cnblogs.com/WArobot/p/6810504.html
AC代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;
int F1[];
void init(){
F1[]=,F1[]=;
for(int i=;i<;i++){
F1[i]=F1[i-]+F1[i-];
}
}
struct Matrix{
int mat[][];
};
Matrix Multiply(Matrix x,Matrix y){
Matrix temp;
memset(temp.mat,,sizeof(temp.mat));
for(int i=;i<;i++)
for(int j=;j<;j++){
for(int k=;k<;k++){
temp.mat[i][j]+=(x.mat[i][k]*y.mat[k][j]%);
}
}
return temp;
}
Matrix Fast_Power(Matrix a,int n){
Matrix res;
memset(res.mat,,sizeof(res.mat));
for(int i=;i<;i++) res.mat[i][i]=;
while(n){
if(n&) res=Multiply(res,a);
n>>=;
a=Multiply(a,a);
}
return res;
}
int find_head(int n){
double t=-0.5*log10(5.0)+(double)n*log10((+pow(5.0,0.5))/);
t=t-floor(t);
double x=pow(,t+);
return (int)floor(x);
}
int main()
{
init();
int n;
while(scanf("%d",&n)==){
if(n<) printf("%d\n",F1[n]);
else{
int head=find_head(n)%;
Matrix temp,ans;
temp.mat[][]=;
temp.mat[][]=temp.mat[][]=temp.mat[][]=;
ans=Fast_Power(temp,n-);
int ending=ans.mat[][]%;
printf("%04d...%04d\n",head,ending); //%04d可以防止出现0424被打印成424
}
}
return ;
}
HDU3117的更多相关文章
- 【HDU3117】Fibonacci Numbers
[HDU3117]Fibonacci Numbers 题面 求斐波那契数列的第\(n\)项的前四位及后四位. 其中\(0\leq n<2^{32}\) 题解 前置知识:线性常系数齐次递推 其实后 ...
- hdu1568&&hdu3117 求斐波那契数前四位和后四位
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1568 题意:如标题所示,求斐波那契数前四位,不足四位直接输出答案 斐波那契数列通式: 当n<=2 ...
- hdu3117之矩阵快速幂
Fibonacci Numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- [HDU3117]Fibonacci Numbers
题目:Fibonacci Numbers 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3117 分析: 1)后四位可以用矩阵快速幂解决.$T= \left ...
- hdu3117 斐波那契前后4位
题意: 求斐波那契的前后4位,n <= 10^8. 思路: 至于前四位,和hdu1568的求法一样: http://blog.csdn.net/u013761 ...
- HDU 3117 Fibonacci Numbers( 矩阵快速幂 + 数学推导 )
链接:传送门 题意:给一个 n ,输出 Fibonacci 数列第 n 项,如果第 n 项的位数 >= 8 位则按照 前4位 + ... + 后4位的格式输出 思路: n < 40时位数不 ...
随机推荐
- Spring boot自定义parent POM
文章目录 概述 不使用Parent POM来引入Spring boot 覆盖依赖项版本 概述 在之前的Spring Boot例子中,我们都会用到这样的parent POM. <parent> ...
- 【Linux常见问题】CentOS 6 root用户密码忘记,找回密码方法
1.Linux的root密码修改不像Windows的密码修改找回,Windows的登录密码忘记需要介入工具进行解决.CentOS6和CentOS7的密码方法也是不一样的,具体如下: 2.centos ...
- XML--XML从入门到精通 Part 1 认识XML
XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没有被预定义.您需要 ...
- 【HBase】带你了解一哈HBase的各种预分区
目录 简单了解 概述 设置预分区 一.手动指定预分区 二.使用16进制算法生成预分区 三.将分区规则写在文本文件中 四.使用JavaAPI进行预分区 简单了解 概述 由上图可以看出,每一个表都有属于自 ...
- JAVA知识总结(四):单例模式和多态
好吧,今天一定要把面向对象的最后一个特性:多态,给说完.不过我们先来聊一聊设计模式,因为它很重要. 设计模式 官方的解释是,设计模式是:一套被反复使用,多数人知晓的,经过分类编目,代码设计经验的总结. ...
- ApplicationInsights迁移国内躺的坑
由于之前有段时间访问国际版的Application Insights实在是慢,而且又不是每个人都有梯子,然后国内版大概在去年(2019)六七月左右已经上线,想着也有一段时日了,要么就迁了吧. 然后实际 ...
- JDBC09 CLOB文本大对象
CLOB(Character Large Object) -用于储存大量的文本数据 BLOB(Binary Large Object) -用于存储大量的二进制数据 -大字段有些特殊,不同数据处理的方式 ...
- [hihoCoder1231 2015BeijingOnline]求圆与多边形公共部分的周长
题意:如题 思路:离散.将所有交点求出来,相当于将多变形的边切成了很多条元边,对每条元边,有两种情况 在圆内,答案加上此边长 在圆外,答案加上此边相对于圆心的"有向转弧" #inc ...
- [hdu5316]线段树
题意:给一个array,有两种操作,(1)修改某一个位置的值,(2)询问区间[L,R]内的最大子段和,其中子段需满足相邻两个数的位置的奇偶性不同 思路:假设对于询问操作没有奇偶性的限制,那么记录区间的 ...
- 测试开发专题:如何在spring-boot中进行参数校验
上文我们讨论了spring-boot如何去获取前端传递过来的参数,那传递过来总不能直接使用,需要对这些参数进行校验,符合程序的要求才会进行下一步的处理,所以本篇文章我们主要讨论spring-boot中 ...