POJ 3070 矩阵快速幂求斐波那契数列

来源:互联网 发布:淘宝游戏点卡货源 编辑:程序博客网 时间:2024/05/17 00:10

方法一:矩阵快速幂取模求斐波那契数列

 
#include<iostream>#include<cstdio>#define maxn 10000using namespace std;struct Matrix{    int v[2][2];}m;Matrix Mul(Matrix A,Matrix B){    Matrix c;    c.v[0][0]=(A.v[0][0]*B.v[0][0]+A.v[0][1]*B.v[1][0])%maxn;    c.v[0][1]=(A.v[0][0]*B.v[0][1]+A.v[0][1]*B.v[1][1])%maxn;    c.v[1][0]=(A.v[1][0]*B.v[0][0]+A.v[1][1]*B.v[1][0])%maxn;    c.v[1][1]=(A.v[1][0]*B.v[0][1]+A.v[1][1]*B.v[1][1])%maxn;    return c;}Matrix mtPow(Matrix A,int k){    if(k==1) return m;    Matrix  b=mtPow(A,k/2);    if(k%2) return Mul(Mul(b,b),m);    return Mul(b,b);}int main(){    int n;    m.v[0][0]=1;    m.v[0][1]=1;    m.v[1][0]=1;    m.v[1][1]=0;    while(scanf("%d",&n)&&n!=-1)    {        if(n==0)        {            printf("0\n");            continue;        }        Matrix u;        u=mtPow(m,n);        printf("%d\n",u.v[0][1]);    }    return 0;}
方法二:

          这个代码是从网上找到的,但是感觉特别适用,尽管现在有几个地方我还不是特别理解,所以先贴进

来,以后慢慢懂。

      

# include <stdio.h>#include<string.h># define MAXN 30# define MOD 10000short int power[MAXN][4] = {{1,1,1,0}};short int ans[4];void mul(short int *a, short int *b, short int *c);int main() {    int n, i;    for (i = 1; i < MAXN; ++i)          mul(power[i], power[i-1], power[i-1]);    while(~scanf("%d",&n))     {           ans[0] = ans[3] = 1;           ans[1] = ans[2] = 0;          if (n == -1) break;           for (i = 0; i < MAXN; ++i)             if (n & (0x1<<i)) mul(ans, ans, power[i]);            printf("%d\n", ans[1]);     }    return 0; }void mul(short int *a, short int *b, short int *c){      short int t[4];            t[0] = (b[0]*c[0] + b[1]*c[2]) % MOD;            t[1] = (b[0]*c[1] + b[1]*c[3]) % MOD;            t[2] = (b[2]*c[0] + b[3]*c[2]) % MOD;            t[3] = (b[2]*c[1] + b[3]*c[3]) % MOD;       memcpy(a, t, sizeof(t));}