矩阵快速幂 求斐波拉切数列的第n项 poj3070
2017-03-08 17:48
357 查看
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
.
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
.
Also, note that raising any 2 × 2 matrix to the 0th power gives the identity matrix:
.
Source
Stanford Local 2006
求斐波拉切数列的第n项数取余后的值 但是问题在于n给的特别大
这时就要用到矩阵快速幂来解决这个问题,直接矩阵快速幂模板,其实和快速幂差不多只是把数换为矩阵即可,在遇到像斐波拉契这种有递推关系时可以考虑一下矩阵快速幂
难点就在于如何构建矩阵,就像上面这个题的矩阵就特别好构造
代码:
#include <cstdio>
#include <iostream>
using namespace std;
const int MOD = 10000;
struct matrix
{
int m[2][2];
}ans, base;
matrix multi(matrix a, matrix b)
{
matrix tmp;
for(int i = 0; i < 2; ++i)
{
for(int j = 0; j < 2; ++j)
{
tmp.m[i][j] = 0;
for(int k = 0; k < 2; ++k)
tmp.m[i][j] = (tmp.m[i][j] + a.m[i][k] * b.m[k][j]) % MOD;
}
}
return tmp;
}
int fast_mod(int n) // 求矩阵 base 的 n 次幂
{
base.m[0][0] = base.m[0][1] = base.m[1][0] = 1;
base.m[1][1] = 0;
ans.m[0][0] = ans.m[1][1] = 1; // ans 初始化为单位矩阵
ans.m[0][1] = ans.m[1][0] = 0;
while(n)
{
if(n & 1) //实现 ans *= t; 其中要先把 ans赋值给 tmp,然后用 ans = tmp * t
{
ans = multi(ans, base);
}
base = multi(base, base);
n >>= 1;
}
return ans.m[0][1];
}
int main()
{
int n;
while(scanf("%d", &n) && n != -1)
{
printf("%d\n", fast_mod(n));
}
return 0;
}
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7241 | Accepted: 5131 |
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
求斐波拉切数列的第n项数取余后的值 但是问题在于n给的特别大
这时就要用到矩阵快速幂来解决这个问题,直接矩阵快速幂模板,其实和快速幂差不多只是把数换为矩阵即可,在遇到像斐波拉契这种有递推关系时可以考虑一下矩阵快速幂
难点就在于如何构建矩阵,就像上面这个题的矩阵就特别好构造
代码:
#include <cstdio>
#include <iostream>
using namespace std;
const int MOD = 10000;
struct matrix
{
int m[2][2];
}ans, base;
matrix multi(matrix a, matrix b)
{
matrix tmp;
for(int i = 0; i < 2; ++i)
{
for(int j = 0; j < 2; ++j)
{
tmp.m[i][j] = 0;
for(int k = 0; k < 2; ++k)
tmp.m[i][j] = (tmp.m[i][j] + a.m[i][k] * b.m[k][j]) % MOD;
}
}
return tmp;
}
int fast_mod(int n) // 求矩阵 base 的 n 次幂
{
base.m[0][0] = base.m[0][1] = base.m[1][0] = 1;
base.m[1][1] = 0;
ans.m[0][0] = ans.m[1][1] = 1; // ans 初始化为单位矩阵
ans.m[0][1] = ans.m[1][0] = 0;
while(n)
{
if(n & 1) //实现 ans *= t; 其中要先把 ans赋值给 tmp,然后用 ans = tmp * t
{
ans = multi(ans, base);
}
base = multi(base, base);
n >>= 1;
}
return ans.m[0][1];
}
int main()
{
int n;
while(scanf("%d", &n) && n != -1)
{
printf("%d\n", fast_mod(n));
}
return 0;
}
相关文章推荐
- 矩阵快速幂求斐波拉切数列
- 斐波那契数列的第N项 矩阵快速幂
- 斐波那契数列的第N项(1≤n≤10^18 矩阵快速幂)
- 快速计算类似斐波那契数列数列的数列的第N项,矩阵快速幂
- poj3070 Fibonacci 斐波那契数列的第n项的矩阵求法
- POJ3070 矩阵快速幂模板题
- poj3070(矩阵快速幂,矩阵乘法)
- 1242 斐波那契数列的第N项 运用矩阵快速幂来求解斐波那契数列问题
- pku 3070 Fibonacci 矩阵快速幂相乘求Fibonacci 数列
- 51 nod 1126 求递推序列的第N项(矩阵快速幂)
- 51Nod 1126 求递推序列的第N项 矩阵快速幂
- HDU2256&&HDU4565:给一个式子的求第n项的矩阵快速幂
- poj3070 (斐波那契,矩阵快速幂)
- 【矩阵快速幂相乘求Fibonacci 数列】PKU-3070-Fibonacci
- <矩阵快速幂>codevs 3332 数列
- 矩阵乘法 与 矩阵快速幂详解 以51NOD1242 斐波那契数列的第N项为例
- 【51NOD1242】斐波那契数列的第N项(矩阵快速幂)
- 【模拟试题】数列 矩阵快速幂
- BZOJ 2326 HNOI 2011 数学作业 矩阵乘法求数列第n项
- Xn数列(矩阵乘法+快速幂+慢速乘法)