poj3070 Fibonacci 矩阵快速幂模板

题意:

求斐波那契数列的第n项 f[n] 膜10000 也就是f[n]%10000
但是0 ≤ n ≤ 1,000,000,000
给了一个式子:
在这里插入图片描述

分析:

用矩阵快速幂图中三个1的那个矩阵A的n-1次幂,第一行第一列的数字就是答案。
(记得取模)
下面是板子和ac代码

抄来的矩阵快速幂板子:
const int maxm=1e3+5;
struct Matrix{
    int a[maxm][maxm];
}res,ans;
Matrix mul(Matrix A,Matrix B,int n){//矩阵A,B和阶数n
    Matrix temp;//临时存放答案的矩阵
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            temp.a[i][j]=0;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            for(int k=1;k<=n;k++){
                temp.a[i][j]+=(A.a[i][k]%mod)*(B.a[k][j]%mod);
                temp.a[i][j]%=mod;
            }
        }
    }
    return temp;
}
void quickpower(int N,int n){//N是幂数,n是阶数
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            ans.a[i][j]=(i==j?1:0);
        }
    }
    while(N>0){
        if(N&1){
            ans=mul(ans,res,n);
        }
        res=mul(res,res,n);
        N>>=1;
    }
}
code:
#include<iostream>
#include<cstdio>
using namespace std;
const int maxm=3;
const int mod=1e4;
struct Matrix{
    int a[maxm][maxm];
}res,ans;
Matrix mul(Matrix A,Matrix B,int n){
    Matrix temp;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            temp.a[i][j]=0;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            for(int k=1;k<=n;k++){
                temp.a[i][j]+=(A.a[i][k]%mod)*(B.a[k][j]%mod);
                temp.a[i][j]%=mod;
            }
        }
    }
    return temp;
}
void quickpower(int N,int n){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            ans.a[i][j]=(i==j?1:0);
        }
    }
    while(N>0){
        if(N&1){
            ans=mul(ans,res,n);
        }
        res=mul(res,res,n);
        N>>=1;
    }
}
int main(){
    int n;
    while(cin>>n){
        if(n==-1)break;
        if(n==0){
            cout<<0<<endl;
            continue;
        }
        if(n==-1)break;
        res.a[1][1]=res.a[1][2]=res.a[2][1]=1;
        res.a[2][2]=0;
        quickpower(n-1,2);
        cout<<ans.a[1][1]<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/91608020