您的位置:首页 > 其它

hdu 4990 矩阵快速幂

2017-03-24 14:48 197 查看
递推公式:f(n)=2*f(n-2)+f(n-1)+1

数据量太大  矩阵快速幂

#include <cstdio>

#include <iostream>

#include <stdlib.h>

#include <string.h>

using namespace std;

long long int mod;

const int m = 3;

struct Matrix

{

    long long int mat[3][3];

};

Matrix mul(Matrix a,Matrix b)//Matrix为结构体类型

{

    Matrix C;

    memset(C.mat,0,sizeof(C.mat));

    for(int i=0; i<m; i++) //m,m,m不一定相同

        for(int j=0; j<m; j++)

            for(int k=0; k<m; k++)

                /*c.m[i][k]+=((a.m[i][j]*b.m[j][k])%MOD)%MOD;

                       c.m[i][k]%=MOD;*/

                C.mat[i][j]=(C.mat[i][j]+(a.mat[i][k]%mod)*(b.mat[k][j]%mod))%mod;

    return C;

}

Matrix power(Matrix a,int x)

{

    Matrix ret;

    memset(ret.mat,0,sizeof(ret.mat));

    for(int i=0; i<m; i++)

        ret.mat[i][i]=1;

    while(x)

    {

        if(x&1)ret=mul(ret,a);

        a=mul(a,a);

        x=x/2;

    }

    return ret;

}

int main()

{

    long long int n;

    Matrix a,b;

    while(cin>>n>>mod)

    {

        memset(a.mat,0,sizeof(a.mat));

        memset(b.mat,0,sizeof(b.mat));

        a.mat[0][0] = 1;

        a.mat[0][1] = 2;

        a.mat[0][2] = 1;

        b.mat[0][1] = 2;

        b.mat[1][0] = 1;

        b.mat[1][1] = 1;

        b.mat[2][1] = 1;

        b.mat[2][2] = 1;

        if(n == 1) cout<<n%mod<<endl;

        if(n == 2) cout<<n%mod<<endl;

        if(n>2){

            b = power(b,n-2);

            a = mul(a,b);

            cout<<a.mat[0][1]%mod<<endl;

        }

        //printf("%d\n", fast_mod(n));

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: