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

构造出的矩阵:

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<

 

你可能感兴趣的:(模板,数学知识)