hdu 4990 矩阵快速幂

来源:互联网 发布:霓虹灯效果图制作软件 编辑:程序博客网 时间:2024/04/30 23:06

递推公式: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;
}
0 0
原创粉丝点击