如何正确构造矩阵
查看原帖
如何正确构造矩阵
285617
黑影洞人楼主2022/2/21 18:53
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 15
#define p 1000000007
#define int long long
using namespace std;
struct jz{
	int m[30][30];
	jz(){memset(m,0,sizeof(m));}
}a,b,cc; 
int n,m,l,k;
char c[1919810]; 
jz mul(jz a,jz b){
	jz res;
	for(int i=1;i<=k;i++){
		for(int j=1;j<=k;j++){
			for(int kk=1;kk<=k;kk++){
				res.m[i][j]=(res.m[i][j]+a.m[i][kk]*b.m[kk][j]%p)%p;
			}
		}
	}
	return res;
}
int csh(int k){
	for(int i=1;i<=k;i++)a.m[1][i]=1;
	for(int i=1;i<=k;i++){
		b.m[2][i]=b.m[i][i]=1;
		for(int j=2;j<i;j++){
			b.m[j][i]=(b.m[j-1][i]+b.m[j-1][i-1])%p;
		}
	}
	
	b.m[k][k]=2;
	for(int i=2;i<=k;i++)b.m[i][1]=b.m[i][k];	
}
int qpow(int a,int b){
	int res=1;
	while(b){
		if(b&1)res=a*res%p;
		a=a*res%p;
		b>>=1;
	}
	return res;
}
int solve(int n){
	jz res=b;
	int kk=n;
	while(kk){
		if(kk&1)res=mul(res,b);
		b=mul(b,b);
		kk>>=1;
	}
	return mul(cc,res).m[1][1]%p+qpow(n%p,k-2)%p;
}
signed main(){
	scanf("%lld%lld",&n,&k);
	k+=2;
	csh(k);
	printf("%lld",solve(n)%p);
	return 0;
}



2022/2/21 18:53
加载中...