题目链接:
妙啊...
因为已经确定的格子数目严格小于了$max(n,m)$,所以至少有一行或者一列是空着的,那么除了这一行或者这一列的格子,其余的格子随意填,只要满足了当且对应的行(列)的积是$-1$就好了,用组合数算一算就好了,剩下的空着的一行或者一列用于收尾,可以发现它当且仅有一种放法。
考虑无解:如果$n+m$为奇数,同时还要注意一下如果$n=1$,或者$m=1$的情况
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 #define maxn 201010 #define llg long long 11 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);12 llg n,m,k,ans,md;13 llg c[maxn][maxn],a[maxn][maxn],d[maxn][maxn];14 bool pd=true;15 inline int getint()16 {17 int w=0,q=0; char c=getchar();18 while((c<'0' || c>'9') && c!='-') c=getchar(); if(c=='-') q=1,c=getchar(); 19 while (c>='0' && c<='9') w=w*10+c-'0', c=getchar(); return q ? -w : w;20 }21 22 llg check(llg x)23 {24 llg sum=0,V=1;25 for (llg i=1;i<=m;i++) sum+=(a[x][i]!=0),V*=a[x][i];26 if (sum==m && V==1) pd=false;27 return sum;28 }29 30 int main()31 {32 yyj("Number");33 cin>>n>>m;34 if ((n+m)&1) {cout<<0; return 0;}35 cin>>k;36 for (llg i=1;i<=k;i++)37 {38 llg x=getint(),y=getint();39 a[x][y]=getint();40 }41 if (n >md;52 c[1][0]=c[1][1]=1;53 for (llg i=2;i