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

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

Fibonacci
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 9769   Accepted: 6959

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

099999999991000000000-1

Sample Output

0346266875

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:

.

解题思路:单纯的快速矩阵幂

快速矩阵幂模板:

Matrix add(Matrix a,Matrix b){	Matrix ans;	for (int i=0;i<2;i++){		for (int j=0;j<2;j++){			ans.mat[i][j]=a.mat[i][j]+b.mat[i][j];			if (ans.mat[i][j]>=m){				ans.mat[i][j]%=m;			}		}	}	return ans;}Matrix mul(Matrix a,Matrix b){	Matrix ans;	for (int i=0;i<2;i++){		for (int j=0;j<2;j++){			ans.mat[i][j]=0;			for (int k=0;k<2;k++){				ans.mat[i][j]+=a.mat[i][k]*b.mat[k][j];				if (ans.mat[i][j]>=m){					ans.mat[i][j]%=m;				}			}		}	}	return ans;}Matrix Init(){	Matrix ans;	for (int i=0;i<2;i++){		for (int j=0;j<2;j++){			if (i==j)				ans.mat[i][j]=1;			else				ans.mat[i][j]=0;		}	}	return ans;}Matrix exp(Matrix a,int k){	Matrix ans=Init();	while (k){		if (k&1)			ans=mul(ans,a);		a=mul(a,a);		k>>=1;	}	return ans;}

参考代码:

#include 
using namespace std;int m=10000;struct Matrix{ long long mat[2][2];};Matrix add(Matrix a,Matrix b){ Matrix ans; for (int i=0;i<2;i++){ for (int j=0;j<2;j++){ ans.mat[i][j]=a.mat[i][j]+b.mat[i][j]; if (ans.mat[i][j]>=m){ ans.mat[i][j]%=m; } } } return ans;}Matrix mul(Matrix a,Matrix b){ Matrix ans; for (int i=0;i<2;i++){ for (int j=0;j<2;j++){ ans.mat[i][j]=0; for (int k=0;k<2;k++){ ans.mat[i][j]+=a.mat[i][k]*b.mat[k][j]; if (ans.mat[i][j]>=m){ ans.mat[i][j]%=m; } } } } return ans;}Matrix Init(){ Matrix ans; for (int i=0;i<2;i++){ for (int j=0;j<2;j++){ if (i==j) ans.mat[i][j]=1; else ans.mat[i][j]=0; } } return ans;}Matrix exp(Matrix a,int k){ Matrix ans=Init(); while (k){ if (k&1) ans=mul(ans,a); a=mul(a,a); k>>=1; } return ans;}int main(){ Matrix a; a.mat[0][0]=a.mat[0][1]=a.mat[1][0]=1; a.mat[1][1]=0; int n; while (cin>>n&&n!=-1){ Matrix ans=exp(a,n); cout<
<

转载地址:http://yfbqb.baihongyu.com/

你可能感兴趣的文章
共享池 shared pool
查看>>
一张图搞定Java面向对象
查看>>
Borland ALM之需求定义和管理解决方案
查看>>
Verizon选择Borland控制开发流程并降低风险
查看>>
Borland 崭新的Caliber Define IT产品
查看>>
IBM Rational RequisitePro集成简介
查看>>
OOAD利器Rational Rose的介绍
查看>>
一年的测试生活和感悟
查看>>
通过RUP用例进行需求管理的可追踪性策略(2)
查看>>
持续改进之配置管理变更的关键路径
查看>>
postgresql 优化与维护
查看>>
mongodb replica sets 测试
查看>>
linux AS6.2 与 as5.4 的对比,性能提升明显
查看>>
FLASHCACHE 的是是非非
查看>>
length() between oracle and postgresql
查看>>
99-lisp lisp 的99个问题 P1-10
查看>>
PG 函数的易变性(Function Volatility Categories)
查看>>
Lisp Quote 和Backquote分析
查看>>
PG psql 变彩色显示
查看>>
SICP 练习 1.3
查看>>