构造出的矩阵:
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;
}