萌新求调,k>30会WA
查看原帖
萌新求调,k>30会WA
245052
Poncirus楼主2021/4/3 14:43

经过多组数据实验发现,本蒟蒻的代码稳定在 k>30k>30 的时候会WA

调了半天了,实在是调不动了QAQ

#include<cstdio>
#include<cstring>
#define int long long
const int mod=1e9+7;
const int maxn=105;
struct Matrix{
	int n,m;
	int c[maxn][maxn]; 
	Matrix(int N=0,int M=0){
		n=N,m=M;
		memset(c,0,sizeof(c));
	}
	Matrix operator*(const Matrix a)const{
		int l=n,r=a.m;
		Matrix x=Matrix(l,r);
		for(int i=1;i<=l;++i){
			for(int j=1;j<=r;++j){
				for(int k=1;k<=m;++k){
					x.c[i][j]+=c[i][k]*a.c[k][j];
					x.c[i][j]%=mod;
				}
			}
		}
		return x;
	}
}A,B;
int n,k,x=4;
int f[45][45]; 
Matrix pow(Matrix&x,int b){
	Matrix ans=Matrix(x.n,x.m);
	for(int i=1;i<=x.m;++i)
        ans.c[i][i]=1;
	while(b){
		if(b&1)
			ans=x*ans;
		x=x*x;
		b>>=1;
	}
	return ans;
}
inline void init(void){
	f[0][0]=1;
	for(int i=1;i<=k;++i){
        f[i][0]=1;
		for(int j=1;j<=i;++j)
			f[i][j]=(f[i-1][j-1]+f[i-1][j])%mod;
	}
    return;
}
signed main(){
    scanf("%lld%lld",&n,&k);
    init();
    A=Matrix(1,3+(k<<1));
    A.c[1][1]=1;A.c[1][2]=2;A.c[1][3]=1;
    for(int i=1;i<=k;++i){
        A.c[1][3+i]=1;
        A.c[1][k+3+i]=x%mod;
        x<<=1;
    }
    B=Matrix(3+(k<<1),3+(k<<1));
    B.c[2][1]=1;
    B.c[1][2]=B.c[2][2]=1;
    B.c[3][3]=B.c[3+(k<<1)][3]=1;
    for(int i=1;i<=k;++i){
        B.c[1][i+k+3]=(1<<i)%mod;
        B.c[3+k+i][3+i]=1;
        B.c[2][3+i+k]=1;
    }
    for(int i=1;i<=k;++i){
        for(int j=i;j<=k;++j){
            B.c[3+i][3+k+j]=(((1<<j-i)%mod)*f[j][i])%mod;
            B.c[3+k+i][3+k+j]=f[j][i];
        }
    }
    // puts("Matrix-A:");
    // for(int i=1;i<=2*k+3;++i)
    //     printf("%lld ",A.c[1][i]);
    // puts("\nMatrix-B:");
    // for(int i=1;i<=2*k+3;++i){
    //     for(int j=1;j<=2*k+3;++j)
    //         printf("%lld ",B.c[i][j]);
    //     puts("");
    // }
    A=A*pow(B,n-1);
    printf("%lld",A.c[1][3]);
    return 0;
}
2021/4/3 14:43
加载中...