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时位数不 ...
随机推荐
- liunx 之 Ubuntu 网速慢解决方法
打开终端依次输入以下指令: sudo lshw -numeric -class network sudo ip addr show sudo ip route show sudo tracepath ...
- C6 C7的开机启动流程
C6开机启动流程 1.内核引导,加电自检(通电后检查内核):检查bios的配置,检测硬件 装好系统之后才会进行以下内容 MBR 引导 (3.2.1...) GRUB菜单 (选择不同的系统)(按e,进入 ...
- flask完成前后端分离实例
需求:通过页面点击完成简单的投票系统功能. 相关文件: 设计思路: 1.前端:提供可以投票的入口.查询的入口.(前端不做数据处理,只做展示) 使用<a> </a> 完成超链接 ...
- D - 小Z的加油店 线段树+差分+GCD
D - 小Z的加油店 HYSBZ - 5028 这个题目是一个线段树+差分+GCD 推荐一个差分的博客:https://www.cnblogs.com/cjoierljl/p/8728110.ht ...
- 简单ajax跨域请求
最近遇到需要ajax跨域的需求 首先看下不做任何处理特别处理的ajax跨域请求会出现什么样的错误 客户端代码: <script type="text/javascript"& ...
- 浅析java中ClassLoader如何加载Class
我的博客地址:https://blog.csdn.net/qq_41907991 ClassLoader是一个经常出现又让很多人望而却步的词.本文试图以最浅显易懂的方式来讲解ClassLoader,希 ...
- blesta运行造成阿里云服务器CPU频繁超载的原因分析
博主在阿里云服务器上安装了主机软件Blesta后,阿里云后台频繁提示CPU超载,打开突发性能模式后,发现CPU负载到了100%.如下图所示: 直接在putty里面reboot整个系统后,负载瞬间降为2 ...
- Mysql常用sql语句(八)- where 条件查询
测试必备的Mysql常用sql语句,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1683347.html 前言 ...
- 【Hadoop离线基础总结】Hadoop的架构模型
Hadoop的架构模型 1.x的版本架构模型介绍 架构图 HDFS分布式文件存储系统(典型的主从架构) NameNode:集群当中的主节点,主要用于维护集群当中的元数据信息,以及接受用户的请求,处理用 ...
- Owin Katana 的底层源码分析
最近看了一下开源项目asp.net katana,感觉公开的接口非常的简洁优雅,channel 9 说是受到node.js的启发设计的,Katana是一个比较老的项目,现在已经整合到asp.net c ...