POJ 3070 Fibonacci(矩阵快速幂)
2016-04-22 18:50
429 查看
Fibonacci
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 12271 Accepted: 8707
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
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 12271 Accepted: 8707
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
#include <iostream> #include <string.h> #include <stdlib.h> #include <algorithm> #include <math.h> #include <stdio.h> using namespace std; const int mod=10000; typedef long long int LL; LL n; struct Node { int a[3][3]; }; Node multiply(Node a,Node b) { Node c; memset(c.a,0,sizeof(c.a)); for(int i=0;i<2;i++) { for(int j=0;j<2;j++) { for(int k=0;k<2;k++) { (c.a[i][k]+=(a.a[i][j]*b.a[j][k])%mod)%=mod; } } } return c; } Node get(Node a,LL x) { Node c; memset(c.a,0,sizeof(c.a)); for(int i=0;i<2;i++) c.a[i][i]=1; for(x;x;x>>=1) { if(x&1) c=multiply(c,a); a=multiply(a,a); } return c; } int main() { while(scanf("%lld",&n)!=EOF) { if(n==-1) break; if(n==0) { printf("0\n"); continue; } Node a; a.a[0][0]=1;a.a[0][1]=1; a.a[1][0]=1;a.a[1][1]=0; a=get(a,n); printf("%d\n",a.a[0][1]); } return 0; }
相关文章推荐
- canvas 图片中心缩放 控制
- 报错: LINQ to Entities does not recognize the method...and this method cannot be translated into a sto
- 如何在ubuntu系统下安装jdk
- linux程序设计学习笔记(1-6)
- win10 死机
- 大神的vim配置
- android 控件 下拉刷新 SwipeRefreshLayout
- 【C#设计模式-单例模式】
- spring @conditional
- spring 多线程-线程池:
- 我的编程语言经历
- 《TCP/IP详解》学习笔记三(13-16)
- cf645C. Enduring Exodus
- Java中的static的使用
- 判断两条线段是否相交
- 剑指offer之面试题15:链表中倒数第k个结点
- iOS触摸事件处理 详解
- 看到两篇不错的jstack分析文章
- spring 异步处理 :
- 相似图片搜索的原理