[矩阵快速幂]HDU 5950 Recursive sequence

来源:互联网 发布:轩辕网络上市 编辑:程序博客网 时间:2024/05/22 11:03

题意:f(n)=2f(n-2)+f(n-1)+n^4,已知f(1),f(2)求f(n)%mod
n4也需要参与矩阵计算中,构造递推关系即可。
递推公式如下:
(n+1)^4=n^4+4n^3+6n^2+4n+1;
(n+1)^3=n^3+3n^2+3n+1;
(n+1)^2=n^2+2n+1;
(n+1)^1=n+1;
(n+1)0=1;

假设最右矩阵为[f(n-1),f(n-2),n^4,n^3,n^2,n,1]T,
构造正确的求[f(n),f(n-1),(n+1)^4,(n+1)^3,(n+1)^2,(n+1),1]T的矩阵就没什么难度了。
const int siz=7;int N=7;Mytype mod=2147493647;struct matrix {    Mytype a[siz][siz];    matrix operator*(const matrix &y)const    {        matrix res;        mem(res.a,0);        for(int i=0;i<N;i++)            for(int j=0;j<N;j++)                if(a[i][j])                    for(int k=0;k<N;k++)                        res.a[i][k]+=a[i][j]*y.a[j][k],res.a[i][k]%=mod;        return res;    }    matrix operator+(const matrix &y)const    {        matrix res;        for(int i=0;i<N;i++)            for(int j=0;j<N;j++)                res.a[i][j]=a[i][j]+y.a[i][j],res.a[i][j]%=mod;        return res;    }    matrix operator*=(const matrix &y)    {        *this=y* *this;        return *this;    }};matrix qmod(matrix a,int k){    matrix res;    mem(res.a,0);    for(int i=0;i<N;i++)        res.a[i][i]=1;    while(k)    {        if(k&1)            res*=a;        a*=a;        k>>=1;    }    return res;}int main(){    matrix a;    mem(a.a,0);    a.a[0][0]=1,a.a[0][1]=2,a.a[0][2]=1;    a.a[1][0]=1;    a.a[2][2]=1,a.a[2][3]=4,a.a[2][4]=6,a.a[2][5]=4,a.a[2][6]=1;    a.a[3][3]=1,a.a[3][4]=3,a.a[3][5]=3,a.a[3][6]=1;    a.a[4][4]=1,a.a[4][5]=2,a.a[4][6]=1;    a.a[5][5]=1,a.a[5][6]=1;    a.a[6][6]=1;    T_T{        int n;        ll f1,f2;        scanf("%d%lld%lld",&n,&f1,&f2);        f1%=mod;        f2%=mod;        if(n==1){            OT(f1),pe();            continue;        }        else if(n==2){            OT(f2),pe();            continue;        }        matrix b=qmod(a,n-2);        ll t[]={f2,f1,81,27,9,3,1};        ll ans=0;        for(int i=0;i<7;i++)            ans=(ans+t[i]*b.a[0][i]%mod)%mod;        OT(ans),pe();    }    return 0;}


阅读全文
0 0