[矩阵快速幂]HDU 5950 Recursive sequence

题意: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值