博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3070 Fibonacci
阅读量:6197 次
发布时间:2019-06-21

本文共 2484 字,大约阅读时间需要 8 分钟。

链接:http://poj.org/problem?id=3070
Fibonacci
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 10796 Accepted: 7678

Description

In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence are:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …

An alternative formula for the Fibonacci sequence is

.

Given an integer n, your goal is to compute the last 4 digits of Fn.

Input

The input test file will contain multiple test cases. Each test case consists of a single line containing n (where 0 ≤ n ≤ 1,000,000,000). The end-of-file is denoted by a single line containing the number −1.

Output

For each test case, print the last four digits of Fn. If the last four digits of Fn are all zeros, print ‘0’; otherwise, omit any leading zeros (i.e., print Fn mod 10000).

Sample Input

0
9
999999999
1000000000
-1

Sample Output

0
34
626
6875

Hint

As a reminder, matrix multiplication is associative, and the product of two 2 × 2 matrices is given by

.

Also, note that raising any 2 × 2 matrix to the 0th power gives the identity matrix:

.

Source
Stanford Local 2006
大意——给你一个求解Fibonacci数列的公式。问:给出一个数n,要你用这个公式计算出F(n)的后四位。

思路——题目已经告诉我们用矩阵连乘求Fibonacci数,问题是n非常大。假设直接矩阵乘n-1次,肯定TLE。因此我们能够用二分求高速幂:

复杂度分析——时间复杂度:O(n),空间复杂度:O(1)

附上AC代码:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef unsigned int UI;typedef long long LL;typedef unsigned long long ULL;typedef long double LD;const double PI = 3.14159265;const double E = 2.71828182846;const int MOD = 10000;struct matrix{ int mat[2][2];} res, base; // 定义一个结构体封装矩阵matrix mul(matrix a, matrix b); // 矩阵乘法运算int fast_mod(int x); // 二分求高速幂// a^n = (a^(n/2))^2 当n为偶数// a^n = a*(a^(n/2))^2 当n为奇数int main(){ ios::sync_with_stdio(false); int num; while (cin >> num && num != -1) { cout << fast_mod(num) << endl; } return 0;}matrix mul(matrix a, matrix b){ matrix temp; for (int i=0; i<2; ++i) for (int j=0; j<2; ++j) { temp.mat[i][j] = 0; for (int k=0; k<2; ++k) temp.mat[i][j] = (temp.mat[i][j]+a.mat[i][k]*b.mat[k][j])%MOD; } return temp;}int fast_mod(int x){ base.mat[0][0]=base.mat[0][1]=base.mat[1][0]=1; base.mat[1][1]=0; // 原始矩阵 res.mat[0][0]=res.mat[1][1]=1; res.mat[0][1]=res.mat[1][0]=0; // 单位矩阵 while (x) { if (x & 1) // 相当于模2 { res = mul(res, base); } base = mul(base, base); x >>= 1; // 相当于除2 } return res.mat[0][1];}
你可能感兴趣的文章
VC6.0之Debug调试总结
查看>>
面向对象设计:共性VS个性-------继承的粒度和聚合的粒度以及类的重构
查看>>
Android应用程序消息处理机制(Looper、Handler)分析(4)
查看>>
easyui简单使用
查看>>
Java开发环境配置(5)--Web 服务器--Tomcat--安装过程遇到的问题
查看>>
[并发]线程池技术小白
查看>>
EasyUI之Hello world(EasyUI的入门学习)
查看>>
Python解析xml文件遇到的编码解析的问题
查看>>
python入门(14)定义函数和接收返回值
查看>>
Struts2的配置文件的配置struts.xml
查看>>
.net使用RabbitMQ
查看>>
病毒木马查杀实战第005篇:熊猫烧香之逆向分析(上)
查看>>
vim不支持鼠标中键拷贝粘贴
查看>>
linux查看和修改PATH环境变量的方法
查看>>
算法笔记_202:第三届蓝桥杯软件类决赛真题(Java高职)
查看>>
WannaCry勒索病毒全解读,权威修复指南大集合
查看>>
柱面模型解析
查看>>
trap-接收信号_采取行动
查看>>
第十篇:K均值聚类(KMeans)
查看>>
我怎么在AD里面找到已经改名的Administrator账户?
查看>>