POJ 3070 矩阵快速幂

来源:互联网 发布:linux和windows传文件 编辑:程序博客网 时间:2024/05/17 07:33

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
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:

这里写图片描述

想法:矩阵做一次乘法需要三重循环,而题目中的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;}
0 0
原创粉丝点击