HDU 1005 Number Sequence(基础矩阵快速幂)

题目链接:
HDU 1005 Number Sequence

//HDU 1005 15MS 1424K
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const long long mod=7;

long long A,B,n;

struct Matrix{
    int row,col;
    long long data[10][10];
};

inline Matrix mul(Matrix a,Matrix b)
{
    Matrix ans;
    ans.row=a.row,ans.col=b.col;
    memset(ans.data,0,sizeof(ans.data));
    for(int i=1;i<=ans.row;i++){
        for(int j=1;j<=ans.col;j++){
            for(int k=1;k<=a.col;k++){
                ans.data[i][j]+=a.data[i][k]*b.data[k][j]%mod;
                ans.data[i][j]%=mod;
            }
        }
    }
    return ans;
}

inline Matrix quick_power(Matrix a,long long m)
{
    Matrix ans,tmp=a;
    ans.row=ans.col=a.row;
    memset(ans.data,0,sizeof(ans.data));
    for(int i=1;i<=ans.row;i++) ans.data[i][i]=1;
    while(m){
        if(m&1) ans=mul(ans,tmp);
        tmp=mul(tmp,tmp);
        m>>=1;
    }
    return ans;
}

int main()
{
    //freopen("1005in.txt","r",stdin);
    while(~scanf("%lld%lld%lld",&A,&B,&n)){
        if(A==0&&B==0&&n==0) break;
        Matrix ans,tmp;
        ans.row=ans.col=tmp.row=2,tmp.col=1;
        ans.data[1][1]=A,ans.data[1][2]=B;
        ans.data[2][1]=1,ans.data[2][2]=0;
        tmp.data[1][1]=tmp.data[2][1]=1;
        if(n==1){
            printf("1\n");
            continue;
        }
        ans=quick_power(ans,n-2);
        tmp=mul(ans,tmp);
        printf("%lld\n",tmp.data[1][1]);
    }
    return 0;
}

你可能感兴趣的:(矩阵快速幂)