Submission #20074

#TimeUsernameProblemLanguageResultExecution timeMemory
20074gs12117비트 (kriii4_Q)C++98
100 / 100
1172 ms1192 KiB
#include<stdio.h>
int n,m;
int mod=1000000007;
long long int fct[110];
long long int ift[110];
long long int mtrx[110][110];
long long int r[110];
int mpow(int x,int y){
	if(y==0)return 1;
	long long int r=mpow(x,y/2);
	r*=r;
	r%=mod;
	if(y%2==1){
		r*=x;
		r%=mod;
	}
	return r;
}
long long int minv(int x){
	return mpow(x,mod-2);
}
struct node{
	long long int x[110];
	node operator+(node z){
		node res;
		int i,j,k;
		for(i=0;i<=n;i++){
			res.x[i]=0;
		}
		for(i=0;i<=n;i++){
			if(x[i]==0)continue;
			for(j=0;j<=n;j++){
				for(k=0;k<=i&&k<=j;k++){
					if(i+j-k-k>n)continue;
					res.x[i+j-k-k]+=x[i]*z.x[j]%mod*fct[i]%mod*fct[j]%mod*fct[n-i]%mod*fct[n-j]%mod*ift[k]%mod*ift[i-k]%mod*ift[j-k]%mod*ift[n+k-i-j]%mod*ift[n]%mod;
					res.x[i+j-k-k]%=mod;
				}
			}
		}
		return res;
	}
};
node p;
node find(int x){
	if(x==1)return p;
	node res=find(x/2);
	res=res+res;
	if(x%2==1)res=res+p;
	return res;
}
int main(){
	int i,j,k;
	long long int t;
	scanf("%d%d",&n,&m);
	fct[0]=1;
	for(i=0;i<=n;i++){
		ift[i]=minv(fct[i]);
		fct[i+1]=fct[i]*(i+1);
		fct[i+1]%=mod;
	}
	for(i=0;i<=n;i++)p.x[i]=0;
	p.x[1]=1;
	node res=find(m);
	node s;
	long long int ans;
	for(i=1;i<=n;i++){
		for(j=0;j<=n;j++)s.x[j]=0;
		s.x[i]=1;
		s=s+res;
		for(j=0;j<=n;j++)mtrx[i][j]=(mod-s.x[j])%mod;
		mtrx[i][i]++;
		r[i]=1;
	}
	r[0]=0;
	mtrx[0][0]=1;
	for(i=0;i<=n;i++){
		for(j=i;j<=n;j++){
			if(mtrx[j]!=0)break;
		}
		for(k=0;k<n;k++){
			t=mtrx[i][k];
			mtrx[i][k]=mtrx[j][k];
			mtrx[j][k]=t;
		}
		t=r[i];
		r[i]=r[j];
		r[j]=t;
		t=minv(mtrx[i][i]);
		r[i]*=t;
		r[i]%=mod;
		for(j=i;j<=n;j++){
			mtrx[i][j]*=t;
			mtrx[i][j]%=mod;
		}
		for(j=i+1;j<=n;j++){
			t=(mod-mtrx[j][i])%mod;
			r[j]+=r[i]*t;
			r[j]%=mod;
			for(k=i;k<=n;k++){
				mtrx[j][k]+=mtrx[i][k]*t;
				mtrx[j][k]%=mod;
			}
		}
	}
	for(i=n;i>=0;i--){
		for(j=0;j<i;j++){
			r[j]+=r[i]*(mod-mtrx[j][i]);
			r[j]%=mod;
		}
	}
	for(i=1;i<=n;i++){
		printf("%lld\n",r[i]);
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...