特殊三角矩阵的矩阵快速幂

构造出的矩阵:

A1...

A1 A2...

A1 A2  A3...

A1 A2 A3 .........An

辅助矩阵:

1 2 3......n

0 1 2......n-1

0 0 1......n-2

0 0 0......1

矩阵式对称的可以只保留(A1,A2.......An)和(1,2,3,....n)进行优化,这样矩阵运算的时候只需要两重循环

#define LL long long
const LL MOD = 1000000007;
const int maxn=2000+3;
int N,K;
LL a[maxn],h[maxn],temp[maxn];
LL b[maxn];//最终存储的结果

void mul(LL *A,LL *B)//矩阵A乘矩阵B,结果储存在A中
{
    memset(temp,0,sizeof(temp));
    for(int i=1; i<=N; ++i)
        for(int j=1; j<=i; ++j)
            temp[i]=(temp[i]+A[j]*B[i-j+1])%MOD;
    for(int i=1; i<=N; ++i)
        A[i]=temp[i];
}

void pow(LL n)//矩阵快速幂,结果储存在b中
{
    for(int i=1; i<=N; ++i) //初始状态矩阵最上层全为1
        h[i]=1;
    memset(b,0,sizeof(1b));
    b[1]=1;//单位矩阵第一行,因为只求的第一行,改第一个就行
    while(n>0)
    {
        if(n&1)
            mul(b,h);
        mul(h,h);
        n>>=1;
    }
}

组合数求解上面的b[]

const LL MOD=1000000007;
LL inv[2050];
int b[2050];
void init()
{
    inv[1]=1;
    for(int i=2;i<=2050;++i)
        inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD;
}
LL C(LL n,LL m)
{
    LL res=1;
    for(int i=1;i<=m;++i)
        res=res*inv[i]%MOD*(n-i+1)%MOD;
    return res;
}
void cal(int n,int k)
{
    for(int i=1;i<=n;++i)
        b[i]=C(k+i-2,i-1);
    for(int i=1;i<=n;++i)
        cout<<b[i]<<endl;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值