[USACO06NOV]玉米田Corn Fields
【代码】
#include<bits/stdc++.h>
using namespace std;
const int N = 15, M = 15, p = 100000000;
int n, m, f[N][1 << M], F[N], a[N][M], MAX, ans = 0;
bool pd[1 << M];
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
scanf("%d", &a[i][j]);
MAX = 1 << m;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
F[i] = (F[i] << 1) + a[i][j];
memset(f,0, sizeof f);
for(int i = 0; i < MAX; ++i)
pd[i] = (i & i >> 1) == 0;
f[0][0] = 1;
for(int i = 1; i <= n; ++i) {
for(int j = 0; j < MAX; ++j)
if((j & F[i]) == j && pd[j])
for(int k = 0; k < MAX; ++k)
if((j & k) == 0) {
f[i][j] += f[i - 1][k];
f[i][j] %= p;
}
}
for(int i = 0; i < MAX; ++i) {
ans += f[n][i];
ans %= p;
}
printf("%d\n", ans);
return 0;
}