30pts WA 求调
查看原帖
30pts WA 求调
536745
WaTleZero_pt楼主2023/10/20 17:34
#include<bits/stdc++.h>
using namespace std;
int x,y;
typedef long long ll;
const ll Mod=1e9+7;
ll dp[2][(1<<6)+5][(1<<6)+5];
int main(){
	scanf("%d%d",&x,&y);
	dp[0][0][0]=1;
	int i,j,k,l,ok,p,ok2,m;
	ll ans=0;
	for(i=1;i<=x;i++){
		memset(dp[i&1],0,sizeof(dp[i&1]));
		for(j=0;j<(1<<y);j++)
			for(k=0;k<(1<<y);k++){
//				printf("%d %d\n",i-1,dp[(i-1)&1][0][0]);
				ok=0;
				for(l=0;l<y;l++){
					if((j&(1<<l))&&(!(j&(1<<l-1)))&&l>1) ok|=(1<<l-2);
					if((j&(1<<l))&&(!(j&(1<<l+1)))) ok|=(1<<l+2);
				}
				if(k&ok) continue;
				ok=0;
				for(l=0;l<y;l++){
					if((k&(1<<l))&&(!(k&(1<<l-1)))&&l>1) ok|=(1<<l-2);
					if((k&(1<<l))&&(!(k&(1<<l+1)))) ok|=(1<<l+2);
				}
				if(j&ok) continue;
				ok=0;
				for(l=0;l<y;l++){
					if((j&(1<<l))&&(!(k&(1<<l)))) ok|=(1<<l+1);
					if((j&(1<<l))&&(!(k&(1<<l)))&&l>0) ok|=(1<<l-1); 
					if((k&(1<<l))&&(!(k&(1<<l-1)))&&l>1) ok|=(1<<l-2);
					if((k&(1<<l))&&(!(k&(1<<l+1)))) ok|=(1<<l+2);
				} 
				for(l=0;l<(1<<y);l++){
					if(!(l&ok)){
						ok2=1;
						for(m=0;m<y;m++){
							if((l&(1<<m))&&(!(l&(l<<m+1)))&&(k&(1<<m+2))) ok2=0;
							if((l&(1<<m))&&(!(l&(l<<m-1)))&&(k&(1<<m-2))) ok2=0;
							if((l&(1<<m))&&(!(k&(1<<m)))&&(j&(1<<m-1))) ok2=0;
							if((l&(1<<m))&&(!(k&(1<<m)))&&(j&(1<<m+1))) ok2=0;
						}
						if(!ok2) continue;
						dp[i&1][k][l]=(dp[i&1][k][l]+dp[(i-1)&1][j][k])%Mod;
//						if(l) ans=(ans+dp[(i-1)&1][j][k])%Mod;//,printf("%d %d %d %d %d %d\n",i,j,k,l,dp[(i-1)&1][j][k],dp[i&1][k][l]);
//						printf("dp[%d][%d][%d]=%d\n",i-1,j,k,dp[(i-1)&1][j][k]);
//						printf("dp[%d][%d][%d]=%d\n",i,k,l,dp[i&1][k][l]);
					}
				}
			}
	}
	for(i=0;i<(1<<y);i++){
		for(j=0;j<(1<<y);j++){
			ok=0;
			for(l=0;l<y;l++){
				if((i&(1<<l))&&(!(i&(1<<l-1)))&&l>1) ok|=(1<<l-2);
				if((i&(1<<l))&&(!(i&(1<<l+1)))) ok|=(1<<l+2);
			}
			if(ok&j) continue;
			ok=0;
			for(l=0;l<y;l++){
				if((j&(1<<l))&&(!(j&(1<<l-1)))&&l>1) ok|=(1<<l-2);
				if((j&(1<<l))&&(!(j&(1<<l+1)))) ok|=(1<<l+2);
			}
			if(ok&i) continue;
			ans=(ans+dp[x&1][i][j])%Mod;
		}
	}
	printf("%lld",ans);
}
2023/10/20 17:34
加载中...