WA

键盘敲碎夜深沉,代码如麻乱假真  •  1个月前


#include<bits/stdc++.h>
using namespace std;
//int dp[][];表示前i个坑,其中最后有连续j个坑
//不放:dp[i][0]=dp[i-1][0]+dp[i-1][1]+……+dp[i-1][m-1](合法的所有可能相加)
//放;dp[i][j]=dp[i-1][j-1]
const int mod=1e9+7;
long long mat[105][105],t1[105][105];
long long ans[105],t2[105];
int main(){
	long long n,m;
	cin>>n>>m;
	ans[0]=1;
	for(int i=0;i<m-1;i++){
		mat[0][i]=1;
		mat[i+1][i]=1;
	}
	mat[0][m-1]=1;
	n++;
	while(n){
		if(n&1){
			memset(t2,0,sizeof t2);
			for(int i=0;i<m;i++){
				for(int j=0;j<m;j++){
					t2[i]+=mat[i][j]*ans[j]%mod;
				}
			}
			for(int i=0;i<m;i++) ans[i]=t2[i]%mod;
		}
		n>>=1;
		memset(t1,0,sizeof t1);
		for(int i=0;i<m;i++){
			for(int j=0;j<m;j++){
				for(int k=0;k<m;k++){
					t1[i][k]+=mat[i][j]*mat[j][k]%mod;
				}
			}
		}
		for(int i=0;i<m;i++){
			for(int j=0;j<m;j++){
				mat[i][j]=t1[i][j]%mod;
			}
		}
	}
	cout<<ans[0]<<"\n";;
	return 0;
}

© 2019 - 2025王码编程  滇ICP备19007937号-1如果您有任何

评论:

请先登录,才能进行评论