【HDU3117】Fibonacci Numbers
【HDU3117】Fibonacci Numbers
题面
求斐波那契数列的第\(n\)项的前四位及后四位。
其中\(0\leq n<2^{32}\)
题解
前置知识:线性常系数齐次递推
其实后四位还是比较好求,矩阵快速幂就可以了,主要是前四位。
先用线性常系数齐次递推求出斐波那契数列的通项公式
\]
因为数列的前\(39\)项我们还是存的下的,所以我们只考虑\(n\geq40\)的情况
考虑到\(n\geq40\)时\(\frac{\sqrt 5}{5}*(\frac{1-\sqrt5}{2})^n\)是个很小的东西,可以不考虑它的影响
那么我们就是要求
\]
现在先考虑这样一个式子,数\(x\)用科学计数法表示
\]
那么\(x\)的前四位即为\(t\)的前四位,我们将\(x\)取个常用对数
\]
类比上式以及我们要求的式子:
y&=\lg\left(\frac{\sqrt 5}{5}(\frac{1+\sqrt5}{2})^n\right)\\
&=\lg\frac{\sqrt 5}{5}+\lg\;(\frac{1+\sqrt5}{2})^n\\
&=\lg\frac{\sqrt 5}{5}+n\times \lg\frac{1+\sqrt5}{2}
\end{aligned}
\]
那么\(\lg t=y-\lfloor y\rfloor\),最后\(1000\times 10^y\)的整数部分就是答案。
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int Mod = 1e4;
struct Matrix {
int m[2][2];
Matrix() { memset(m, 0, sizeof(m)); }
void init() { for (int i = 0; i < 2; i++) m[i][i] = 1; }
int *operator [] (int id) { return m[id]; }
Matrix operator * (const Matrix &b) {
Matrix res;
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
for (int k = 0; k < 2; k++)
res[i][j] = (res[i][j] + m[i][k] * b.m[k][j] % Mod) % Mod;
return res;
}
} ;
int N, f[40];
int TASK1() {
double s = log10(sqrt(5.0) / 5.0) + 1.0 * N * log10((1.0 + sqrt(5.0)) / 2.0);
s = s - (int)s;
double ans = 1000 * pow(10.0, s);
return ans;
}
int TASK2() {
Matrix S, T, ans; int n = N; ans.init();
S[0][0] = 1;
T[0][0] = 1, T[0][1] = 1;
T[1][0] = 1, T[1][1] = 0;
while (n) { if (n & 1) ans = ans * T; n >>= 1; T = T * T; }
S = ans * S;
return ans[1][0];
}
int main () {
f[0] = 0, f[1] = 1; for (int i = 2; i < 40; i++) f[i] = f[i - 1] + f[i - 2];
while (~scanf("%d", &N)) {
if (N < 40) { printf("%d\n", f[N]); continue; }
printf("%04d...%04d\n", TASK1(), TASK2());
}
return 0;
}
【HDU3117】Fibonacci Numbers的更多相关文章
- 【HDU1848】Fibonacci again and again(博弈论)
[HDU1848]Fibonacci again and again(博弈论) 题面 Hdu 你有三堆石子,每堆石子的个数是\(n,m,p\),你每次可以从一堆石子中取走斐波那契数列中一个元素等数量的 ...
- 【CF55D】Beautiful numbers(动态规划)
[CF55D]Beautiful numbers(动态规划) 题面 洛谷 CF 题解 数位\(dp\) 如果当前数能够被它所有数位整除,意味着它能够被所有数位的\(lcm\)整除. 所以\(dp\)的 ...
- 【CF628D】Magic Numbers 数位DP
[CF628D]Magic Numbers 题意:求[a,b]中,偶数位的数字都是d,其余为数字都不是d,且能被m整除的数的个数(这里的偶数位是的是从高位往低位数的偶数位).$a,b<10^{2 ...
- 【CF55D】Beautiful numbers
[CF55D]Beautiful numbers 题面 洛谷 题解 考虑到如果一个数整除所有数那么可以整除他们的\(lcm\),而如果数\(x\)满足\(x\bmod Lcm(1,2...,9)=r\ ...
- 【poj3070】 Fibonacci
http://poj.org/problem?id=3070 (题目链接) 题意 用矩阵乘法求fibonacci数列的第n项. Solution 矩乘入门题啊,题目把题解已经说的很清楚里= =. 矩乘 ...
- 【类似N^N做法的斐波那契数列】【HDU1568】 Fibonacci
Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HackerRank】Missing Numbers
Numeros, The Artist, had two lists A and B, such that, B was a permutation of A. Numeros was very pr ...
- 【HackerRank】Closest Numbers
Sorting is often useful as the first step in many different tasks. The most common task is to make f ...
- 【算法】Fibonacci(斐波那契数列)相关问题
一.列出Fibonacci数列的前N个数 using System; using System.Collections.Generic; using System.Linq; using System ...
随机推荐
- 深入理解 iOS Rendering Process
本文将从 OpenGL 的角度结合 Apple 官方给出的部分资料,介绍 iOS Rendering Process 的概念及其整个底层渲染管道的各个流程. 相信在理解了 iOS Rendering ...
- [转]CentOS 7忘记root密码解决办法
转自:http://www.linuxidc.com/Linux/2016-08/134034.htm 亲测可用! CentOS 7 root密码的重置方式和CentOS 6完全不一样,CentOS ...
- java反序列化Commons-Collections1分析
AnnotationInvocationHandler关键类 Commons-Collections1也是利用InvokerTransformer类中的transform方法反射机制执行命令.实验用的 ...
- 【CSS-flex】圣杯布局(Holy Grail Layout)、输入框的布局、悬挂式布局、固定的底栏
1.圣杯布局(Holy Grail Layout) 其指的是一种最常见的网站布局.页面从上到下,分成三个部分:头部(header),躯干(body),尾部(footer).其中躯干又水平分成三栏,从左 ...
- Spring(十五)之声明式事务
声明式事务管理方法允许你在配置的帮助下而不是源代码硬编程来管理事务.这意味着你可以将事务管理从事务代码中隔离出来.你可以只使用注释或基于配置的 XML 来管理事务. bean 配置会指定事务型方法.下 ...
- [教程] macOS打开原生的NTFS读写功能
Mac本身实际上是支持原生的NTFS读写的,只不过这一功能被隐藏了,但是可以手动打开,这比第三方的的工具要安全得多,有时第三方工具可能会发生整个NTFS分区数据丢失的情况,下面是打开MAC原生NTFS ...
- VC++ TCP网络控制台程序
在Windows7系统下,采用工具为VS2008,Win32控制台应用程序,编写一个基于TCP的Client/Server网络程序. 1.服务器端代码 #include <WinSock2.h& ...
- Java利用 ganymed-ssh2-build.jar来上传文件到linux以及下载linux文件以及执行linux shell命令
package api; import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.IOExcepti ...
- 【Step By Step】将Dotnet Core部署到Docker下
一.使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章<尝试.Net Core—使用.Net Core + Entity FrameWor ...
- CCF认证201803-1 跳一跳
import java.util.Scanner; public class Jump { public static void main(String[] args) { Scanner sc = ...