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时位数不 ...
随机推荐
- 汇编 之 win10 下安装dosbox 和 MASM
所需工具链接: 链接:https://pan.baidu.com/s/1nenMsSdgEkeRKc6wh9DQRA 提取码:1r89 只需要以下两个工具 安装dosbox 和MASM步骤 (1)解压 ...
- 【JAVA基础】09 Eclipse
1. Java开发工具 操作系统自带的记事本软件 高级记事本软件 集成开发环境 IDE (Integrated Development Environment) Eclipse和MyEclipse的区 ...
- 标准库ConfigParser模块
用于生成和修改常见配置文档,当前模块的名称在 python 3.x 版本中变更为 configparser. 来看一个好多软件的常见文档格式如下: 1 2 3 4 5 6 7 8 9 10 11 12 ...
- Java演示设计模式中的写代码的代码
下边代码内容是关于Java演示设计模式中的单件模式的代码,应该是对小伙伴们有所用处. public class SimpleSingleton { private static SimpleSingl ...
- xml文件错误
2019独角兽企业重金招聘Python工程师标准>>> xml文件错误The processing instruction target matching "[xX][mM ...
- Redis 服务搭建
1.redis 简介 Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key-value 数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis ...
- Scrapy爬虫框架基本使用
scrapyhub上有些视频简单介绍scrapy如何学习的(貌似要FQ):https://helpdesk.scrapinghub.com/support/solutions/articles/220 ...
- 入职半年多,Guide哥总结了这些帮助你领先90%程序员的好习惯!
大家好,我是 Guide 哥,这篇文章还是不分享技术文章了,我想简单聊聊一些程序员的好习惯. 其实自己写这篇文章还是很忐忑的,毕竟自己算不上一个优秀的程序员,但也不是那么差.大学学习编程 4 年,工作 ...
- 支付宝小程序云开发serverless----获取用户的user_id
支付宝小程序云开发serverless----获取用户的user_id 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 开通云调 ...
- D. Ehab the Xorcist(纯构造方法)
\(如果觉得下面难以理解,可以去这里看一种较为简单的解法\):saf \(这个题嘛,首先要明确异或的性质:相同为0,不同为1.\) \(举个例子,我们来构造u=15和v=127的情况\) \(注意到, ...