求助
查看原帖
求助
464001
5793__qwq楼主2023/6/14 22:33
#include<bits/stdc++.h>
using namespace std;
long long n,m,ans,f[3][1<<7][1<<7]; 
int pos(int x,int p){return x&(1<<p);}
bool judge(int x,int y,int z){
	for(int k=1;k<m-1;++k)	
		if((!pos(y,k+1)||!pos(x,k+1))&&pos(y,k)&&pos(x,k+2))
			return 0;
	for(int k=3;k<=m;++k)	
		if((!pos(y,k-1)||!pos(x,k-1))&&pos(y,k)&&pos(x,k-2))
			return 0;
/*	for(int k=1;k<m-1;++k)	
		if((!pos(z,k+1)||!pos(y,k+1))&&pos(z,k)&&pos(y,k+2))
			return 0;
	for(int k=3;k<=m;++k)	
		if((!pos(z,k-1)||!pos(y,k-1))&&pos(z,k)&&pos(y,k-2))
			return 0;
*/	for(int k=1;k<m;++k)	
		if((!pos(y,k)||!pos(y,k+1))&&pos(z,k)&&pos(x,k+2))
			return 0;
	for(int k=2;k<=m;++k)	
		if((!pos(y,k-1)||!pos(y,k))&&pos(z,k)&&pos(x,k-2))
			return 0;
	return 1;
}
int main(){
	cin>>n>>m;
	for(int j=0;j<(1<<m);++j)
		f[0][j<<1][0]=1;
	for(int j=0;j<(1<<m);++j)
		ans++,ans%=1000000007;
	for(int j=0;j<(1<<m);++j)
		for(int k=0;k<(1<<m);++k)
			if(judge(j<<1,k<<1,0))	
				f[1][j<<1][k<<1]+=f[0][k<<1][0];
	for(int j=1;j<(1<<m);++j)
		for(int k=1;k<(1<<m);++k)
			if(judge(j<<1,k<<1,0))
				ans+=f[1][j<<1][k<<1],ans%=1000000007;
	for(int i=3;i<=n;++i){
		for(int l=0;l<(1<<m);++l)
			for(int k=1;k<(1<<m);++k)
				for(int j=1;j<(1<<m);++j)
					if(judge(j<<1,k<<1,l<<1))
						f[2][j<<1][k<<1]+=f[1][k<<1][l<<1];
		for(int j=1;j<(1<<m);++j)
			for(int k=1;k<(1<<m);++k)
				if(judge(j<<1,k<<1,0))
					ans+=f[2][j<<1][k<<1],ans%=1000000007;
		memcpy(f[0],f[1],sizeof(f[0]));
		memcpy(f[1],f[2],sizeof(f[1]));
		memset(f[2],0,sizeof(f[2]));
	}
	cout<<ans;
	return 0;
}

2023/6/14 22:33
加载中...