poj 3070 Fibonacci(矩阵快速幂,简单)

题目

还是一道基础的矩阵快速幂。

具体的居者的幂公式我就不明示了。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

int num,mod=10000;
struct matrix
{
    int a[2][2];
};

matrix multiply(matrix x,matrix y)//矩阵乘法
{
       matrix temp;
       for(int i=0;i<num;i++)
       {
               for(int j=0;j<num;j++)
               {
                       int ans=0;
                       for(int k=0;k<num;k++)
                       {
                               ans+=((x.a[i][k]*y.a[k][j])%mod);
                       }
                       temp.a[i][j]=ans%mod;
               }
       }
       return temp;
}

matrix calc(matrix origin,matrix answ,int n)//矩阵快速幂——answ*origin^n
{
     while(n)
     {
             if(n%2==1)
                    answ=multiply(origin,answ);
             origin=multiply(origin,origin);
             n/=2;
     }
     return answ;
}

int main()
{

  // freopen("in.txt", "r", stdin);   
  // freopen("out.txt", "w", stdout);  
   int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==-1)break;
        matrix origin= {0,1,
                        1,1};
        matrix answ={0,0,
                     1,0};
        num=2;
        if(n==0||n==1)printf("%d
",n);
        else
        {
            answ=calc(origin,answ,n-1);
            printf("%d
",answ.a[1][0]);
        }
    }
    return 0;
}
View Code
一道又一道,好高兴!
原文地址:https://www.cnblogs.com/laiba2004/p/3560218.html