题解
2025-08-09 19:26:40
发布于:广东
3阅读
0回复
0点赞
#include<bits/stdc++.h>
#define rep(i,alpha,iee) for(auto gs##i=(iee),i=(alpha);i<=gs##i;++i)
#define per(i,alpha,iee) for(auto gs##i=(iee),i=(alpha);i>=gs##i;--i)
#define fi first
#define se second
#define ep emplace
#define eb emplace_back
using namespace std;
typedef long long ll;
namespace IO{
char buf[1<<20],*p1,*p2;
// #define gc() (p1==p2&&(p2=buf+fread(p1=buf,1,1<<20,stdin),p1==p2)?-1:*p1++)
#define gc() getchar()
template<class T>
inline void read(T &x){
x=0;int f=0;char c=gc();
for(;!isdigit(c);c=gc())f|=(c=='-');
for(;isdigit(c);c=gc())x=(x<<1)+(x<<3)+(c^48);
x=f?-x:x;
}
#undef gc
}using namespace IO;
const int N=20,d1[]={0,1,3},d2[]={1,0,3},mod=1e9+7,M=(1<<20);
int n,m,a[N][N],S[N],f[N][M],g[N][M],ans[N][N];
vector<pair<int,int>> st;
void dfs(int cur,int p1,int p2){
if(cur==n){st.eb(p1,p2);return;}
for(int i=0;i<3;++i){
int n1=p1,n2=p2;
if(i==2){if(cur+1<n)n1=(n1<<2)+d1[i],n2=(n2<<2)+d2[i],dfs(cur+2,n1,n2);}
else n1=(n1<<1)+d1[i],n2=(n2<<1)+d2[i],dfs(cur+1,n1,n2);
}
}
inline void initG(){
g[m+1][(1<<n)-1]=1;
per(i,m,1){
for(auto &x:st){
int s=x.fi,t=x.se;
if(s&S[i])continue;
(g[i][s|S[i]]+=g[i+1][t])%=mod;
}
rep(j,0,n-1)rep(s,0,(1<<n)-1)if((s>>j)&1)(g[i][s]+=g[i][s^(1<<j)])%=mod;
}
}
int main(){
read(n),read(m);
dfs(0,0,0);
rep(i,0,n-1)rep(j,1,m)read(a[i][j]);
rep(j,1,m)per(i,n-1,0)S[j]=S[j]*2+a[i][j];
initG();
f[0][(1<<n)-1]=1;
rep(i,1,m){
for(auto &x:st){
int s=x.fi,t=x.se;
if(s&S[i])continue;
(f[i][s|S[i]]+=f[i-1][t])%=mod;
}
rep(j,0,n-1){
rep(s,0,(1<<n)-1)if((s>>j)&1)(f[i][s]+=f[i][s^(1<<j)])%=mod;
}
rep(j,0,n-1)if(!a[j][i]){
int nS=(1<<j),&res=ans[j][i];
rep(s,0,(1<<n)-1){
if(s&nS)continue;
(res+=1ll*f[i][s]*g[i+1][s|nS]%mod)%=mod;
}
}
}
rep(i,0,n-1)rep(j,1,m)printf("%d%c",ans[i][j]," \n"[j==m]);
return 0;
}
这里空空如也
有帮助,赞一个