30pts玄关,求调
  • 板块P2106 Sam数
  • 楼主gb_lw
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/5 11:49
  • 上次更新2024/8/5 13:10:53
查看原帖
30pts玄关,求调
731694
gb_lw楼主2024/8/5 11:49
#include<bits/stdc++.h>
using namespace std;
const int sz=10,mod=1000000007;
int k;

struct mat{
	long long a[sz][sz]={};
	
	mat operator *(const mat& T) const{
		mat res;
		int r;
		for(int i=0;i<sz;i++){
			for(int k=0;k<sz;k++){
				r=a[i][k];
				for(int j=0;j<sz;j++){
					res.a[i][j]+=T.a[k][j]*r;
					res.a[i][j]%=mod;
				}
			}
		}
		return res;
	} 
	mat operator ^(long long x) const{
		mat res,bas;
		for(int i=0;i<sz;i++)res.a[i][i]=1;
		for(int i=0;i<sz;i++){
			for(int j=0;j<sz;j++){
				bas.a[i][j]=a[i][j]%mod;
			}
		}
		while(x){
			if(x&1)res=res*bas;
			bas=bas*bas;
			x>>=1;
		}
		return res;
	}
};
int main(){
	cin>>k;
	if(k==1){
		cout<<10;
		return 0;
	}
	mat a,b;
	for(int i=0;i<sz;i++){
		for(int j=max(0,i-2);j<=min(sz-1,i+2);j++){
			a.a[i][j]=1;
		}
	}
	for(int i=1;i<sz;i++){
		b.a[0][i]=1;
	}
	mat c=(b*(a^(k-1)));
	long long ans=0;
	for(int i=0;i<sz;i++){
		ans=(ans+c.a[0][i])%mod;
	}
	cout<<ans;
	return 0;
}
2024/8/5 11:49
加载中...