Poj 3070 Fibonacci (矩阵快速幂)
2016-09-04 15:39
423 查看
题目链接:http://poj.org/problem?id=3070
Fibonacci
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
![](http://poj.org/images/3070_1.png)
.
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
Sample Output
Hint
As a reminder, matrix multiplication is associative, and the product of two 2 × 2 matrices is given by
![](http://poj.org/images/3070_2.png)
.
Also, note that raising any 2 × 2 matrix to the 0th power gives the identity matrix:
![](http://poj.org/images/3070_3.gif)
.
Source
题目大意:求斐波拉契数列F(n) % 10000
解析:题中很明显的提示,用矩阵快速幂去求
代码如下:
#include<iostream>
#include<algorithm>
#include<map>
#include<stack>
#include<queue>
#include<set>
#include<string>
#include<cstdio>
#include<cstring
bfdd
>
#include<cctype>
#include<cmath>
#define N 1000009
using namespace std;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-8;
const double pi = acos(-1.0);
typedef long long LL;
int q_mod(int b)
{
int i, j;
int a[2][2] = {1, 1, 1, 0};
int tm[2][2];
int ans[2][2] = {1, 0, 0, 1};
while(b)
{
if(b & 1)
{
for(i = 0; i < 2; i++)
for(j = 0; j < 2; j++)
tm[i][j] = ans[i][j];
memset(ans, 0, sizeof(ans));
for(i = 0; i < 2; i++)
{
for(j = 0; j < 2; j++)
{
for(int k = 0; k < 2; k++)
{
ans[i][j] = ans[i][j] + tm[i][k] * a[k][j];
ans[i][j] %= 10000;
}
}
}
}
for(i = 0; i < 2; i++)
for(j = 0; j < 2; j++)
tm[i][j] = a[i][j];
memset(a, 0, sizeof(a));
for(i = 0; i < 2; i++)
{
for(j = 0; j < 2; j++)
{
for(int k = 0; k < 2; k++)
{
a[i][j] = a[i][j] + tm[i][k] * tm[k][j];
a[i][j] %= 10000;
}
}
}
b >>= 1;
}
return ans[0][1];
}
int main()
{
int n;
while(scanf("%d", &n), n != -1)
{
printf("%d\n", q_mod(n));
}
return 0;
}
Fibonacci
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 13262 | Accepted: 9430 |
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
![](http://poj.org/images/3070_1.png)
.
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
![](http://poj.org/images/3070_2.png)
.
Also, note that raising any 2 × 2 matrix to the 0th power gives the identity matrix:
![](http://poj.org/images/3070_3.gif)
.
Source
题目大意:求斐波拉契数列F(n) % 10000
解析:题中很明显的提示,用矩阵快速幂去求
代码如下:
#include<iostream>
#include<algorithm>
#include<map>
#include<stack>
#include<queue>
#include<set>
#include<string>
#include<cstdio>
#include<cstring
bfdd
>
#include<cctype>
#include<cmath>
#define N 1000009
using namespace std;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-8;
const double pi = acos(-1.0);
typedef long long LL;
int q_mod(int b)
{
int i, j;
int a[2][2] = {1, 1, 1, 0};
int tm[2][2];
int ans[2][2] = {1, 0, 0, 1};
while(b)
{
if(b & 1)
{
for(i = 0; i < 2; i++)
for(j = 0; j < 2; j++)
tm[i][j] = ans[i][j];
memset(ans, 0, sizeof(ans));
for(i = 0; i < 2; i++)
{
for(j = 0; j < 2; j++)
{
for(int k = 0; k < 2; k++)
{
ans[i][j] = ans[i][j] + tm[i][k] * a[k][j];
ans[i][j] %= 10000;
}
}
}
}
for(i = 0; i < 2; i++)
for(j = 0; j < 2; j++)
tm[i][j] = a[i][j];
memset(a, 0, sizeof(a));
for(i = 0; i < 2; i++)
{
for(j = 0; j < 2; j++)
{
for(int k = 0; k < 2; k++)
{
a[i][j] = a[i][j] + tm[i][k] * tm[k][j];
a[i][j] %= 10000;
}
}
}
b >>= 1;
}
return ans[0][1];
}
int main()
{
int n;
while(scanf("%d", &n), n != -1)
{
printf("%d\n", q_mod(n));
}
return 0;
}
相关文章推荐
- 7_13_F题 K Best(二分、最大化平均值)
- Java 面试题和答案 - (下)
- Sticks
- Leetcode #3 Longest Substring Without Repeating Characters
- 深入分析AsyncTask
- yii框架循环添加只能加入最后一条的解决办法
- Find the difference——Difficulty:Easy
- 7_13_E题 Pie(二分)
- HBase协处理器
- SourceTree windows版本免注册免登陆使用方法
- 【NOIP模拟】树上摩托
- 7_13_B题 Boonie and Clyde(tarjan求割点)
- 7_13_A题 SPF (tarjan求割点)
- NOIP提高组模拟 树上摩托
- 智能硬件开发如何选择低功耗MCU?
- 【读书笔记】《Web全栈工程师的自我修养》
- 7_11_I题 Gems Fight!(状压dp)
- Android手势识别
- 7_11_ H题 Rabbit Kingdom(容斥+树状数组)
- NCPC 2014 H clock pictures