莫名CE+样例2没过求条
查看原帖
莫名CE+样例2没过求条
752094
MornHus楼主2023/11/9 20:43
#include<bits/stdc++.h>
using namespace std;

#define mod 1000000007

long long dp[5][1<<6+1][1<<6+1];
//straight   this  last
int n,m;

bool ck[1<<6+1][1<<6+1];

inline bool check_one(int a,int b){//O(12)
	//a attack b
	for(int i=0;i<m;i++){
		if(a&(1<<i)){
			int l=i+1,r=i-1;
			if(l<m-1&&!(a&(1<<l))){
				if(b&(1<<(l+1))){
					return 1;
				}
			}
			if(r>=1&&!(a&(1<<r))){
				if(b&(1<<(r-1))){
					return 1;
				}
			}
		}
	}
	//b attack a
	for(int i=0;i<m;i++){
		if(b&(1<<i)){
			int l=i+1,r=i-1;
			if(l<m-1&&!(b&(1<<l))){
				if(a&(1<<(l+1))){
					return 1;
				}
			}
			if(r>=1&&!(b&(1<<r))){
				if(a&(1<<(r-1))){
					return 1;
				}
			}
		}
	}
	return 0;
}

inline check_two(int a,int b,int c){//O(24)
	if( ck[a][b] || ck[b][c] )return 1;
	
	
	//a attack c
	for(int i=0;i<m;i++){
		if(b&(1<<i)||!(a&(1<<i)))continue;
		int l=i+1,r=i-1;
		if(l<m&&(c&(1<<l))){
			return 1;
		}
		if(r>=0&&(c&(1<<r))){
			return 1;
		}
	}
	
	//c attack a
	for(int i=0;i<m;i++){
		if(b&(1<<i)||!(c&(1<<i)))continue;
		int l=i+1,r=i-1;
		if(l<m&&(a&(1<<l))){
			return 1;
		}
		if(r>=0&&(a&(1<<r))){
			return 1;
		}
	}
	return 0;
}

int main(){
	cin>>n>>m;
	for(int i=0;i<(1<<m);i++){
		dp[1][i][0]=1;
	}
	for(int i=0;i<(1<<m);i++){
		for(int j=0;j<(1<<m);j++){
				if(check_one(i,j)){
					ck[i][j]=ck[j][i]=1;
					continue;
				}
				dp[2][i][j]+=dp[1][j][0];
		}
	}
	
	for(int line=3;line<=n;line++){
		for(int i=0;i<(1<<m);i++){
			for(int j=0;j<(1<<m);j++){
				for(int k=0;k<(1<<m);k++){
					if(check_two(i,j,k)){
						dp[line%3][k][j]+=dp[(line-1)%3][j][i];
						dp[line%3][k][j]%=mod;
					}
				}
			}
		}
	}
	
	long long ans=0;
	
	for(int i=0;i<(1<<m);i++){
		for(int j=0;j<(1<<m);j++){
			if(ck[i][j])continue;
			ans+=dp[n%3][i][j];
			ans%=mod;
		}
	}
	
	cout<<ans;
	return 0;
}


/*

600 个格子!!

 


*/
2023/11/9 20:43
加载中...