POJ 3070 矩阵快速幂
2015-08-10 20:22
260 查看
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
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)
想法:矩阵做一次乘法需要三重循环,而题目中的n给得又是那么得大,所以用暴力的解法肯定是TLE的,所以我们想到了快速幂的方法,只要把其中的乘法换成矩阵的乘法法则即可。
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)
想法:矩阵做一次乘法需要三重循环,而题目中的n给得又是那么得大,所以用暴力的解法肯定是TLE的,所以我们想到了快速幂的方法,只要把其中的乘法换成矩阵的乘法法则即可。
//base的n次方.快速幂方式 int fast_mod(int n,int base) { int ans = 1; while(n) { if(n&1) ans = ans*base%mod; base = base*base%mod; n>>=1; } return ans; }
#include <cstdio> #include <cstring> #include <vector> #include <algorithm> #include <map> #include <iostream> using namespace std; long long phi[3000010]; const int mod = 10000; struct matrix { int m[2][2]; }a,base; matrix xiangcheng(matrix a,matrix base) //矩阵乘法的代码 { matrix temp; for (int i = 0; i<2; i++) { for (int j = 0; j<2; j++) { temp.m[i][j] = 0; for (int k = 0; k<2; k++) { temp.m[i][j] =(temp.m[i][j]+a.m[i][k]*base.m[k][j])%mod; } } } return temp; } int fast_mod(long long n) { base.m[0][0] = base.m[0][1] = base.m[1][0] = 1; base.m[1][1] = 0; //初始化base. a.m[0][0] = a.m[1][1] = 1; a.m[0][1] = a.m[1][0] = 0; //把a初始化成单位矩阵。 while (n) { //快速幂 if (n&1) { //判断最后一位是否为1. a = xiangcheng(a, base); //换成矩阵乘法. } base = xiangcheng(base, base); n>>=1; //左移一位. } return a.m[0][1]; } int main() { long long n; cin>>n; while (n!=-1) { cout<<fast_mod(n)%mod<<endl; cin>>n; } return 0; }
相关文章推荐
- 多路复用/多路分解
- 智能指针的原理与设计
- HDU - 1241 Oil Deposits
- hdu 2030 汉字统计
- (笔试题)质数因子Prime Factor
- Eclipse启动Tomcat时,45秒超时解决方式
- 【HDU 4760】Good Firewall(Trie水题)
- 【vector】【bzoj 2083】Intelligence test
- IOS--JSON数据解析成字典
- java之集合Collection详解之2
- java之集合Collection详解之2
- [c语言]冒泡排序-------对折判断法
- IO基础入门之I/O多路复用技术
- poj 1260 Pearls dp
- 算法——贝叶斯
- 母婴电商:不只卖给妈妈,何不换个思路卖给爸爸?
- UVA 1225 Digit Counting
- 该以什么样的心态面对工作
- BLHeli
- acm 输入输出外挂