100pts求助!hack没过求条pwp
查看原帖
100pts求助!hack没过求条pwp
684245
zhangyaiwei楼主2023/5/28 19:49
#include<bits/stdc++.h>
using namespace std;
unsigned long long n,m,a[3111],f[21][411][3111];
bool P[3111],K[21][21];
bool Can(unsigned long long M,unsigned long long B){
	for(unsigned long long i=0;i<m;i++){
		if((M&(1<<i))&&!K[B][i]){
			return 0;
		}
	}
	return 1;
}
int main(){
	cin>>n>>m;
	for(unsigned long long i=1;i<=n;i++){
		for(unsigned long long j=0;j<m;j++){
			cin>>K[i][j];
		}
	}
	for(unsigned long long i=0;i<=(1<<m)-1;i++){
		for(unsigned long long j=0;j<m;j++){
			if(i&(1<<j)){
				a[i]++;
			}
		}
		if(!(((i<<1)|(i>>1))&i)){
			P[i]=1;
		}
	}
	f[0][0][0]=1;
	for(unsigned long long i=1;i<=n;i++){
		//cout<<"i:"<<i<<endl;
		for(unsigned long long A=0;A<=(1<<m)-1;A++){
			if(P[A]&&Can(A,i)){
				//cout<<"  A:"<<A<<endl;
				for(unsigned long long B=0;B<=(1<<m)-1;B++){
					if(P[B]&&Can(B,i-1)){
						//cout<<"    B:"<<B<<endl;
						if(!(B&A)){
							for(unsigned long long j=a[A];j<=i*m;j++){
								f[i][j][A]+=f[i-1][j-a[A]][B];
								f[i][j][A]%=100000000;
							}
						}
					}
				}
			}
		}
	}
	unsigned long long ans=0;
	for(unsigned long long i=0;i<=(1<<m)-1;i++){
		for(unsigned long long j=0;j<=n*m;j++){
			ans+=f[n][j][i];
			ans%=100000000;
		}
	}
	cout<<ans;
}
2023/5/28 19:49
加载中...