Problem A. Harry and Magical Computer
dfs()。
http://acm.hust.edu.cn/vjudge/problem/viewSource.action?id=3135139
贪心。
http://acm.hust.edu.cn/vjudge/problem/viewSource.action?id=3135141
Problem B. Harry And Magic Box
给定一个 n*m 个矩阵,问其中有多少 0/1 方案是的每一行,每一列至少有一个 1。
暴力冗斥。
const int N = int(50) + 9; Int C[N][N], A[N][N]; int n; int main(){ #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); #endif REP(i, N){ C[i][0] = 1; REP_1(j, i) C[i][j] = C[i-1][j-1] + C[i-1][j]; } REP_1(i, N){ REP_1(j, N){ A[i][j] = pow(2, i*j) - 1; REP_1(ii, i) REP_1(jj, j) if (ii != i || jj != j){ A[i][j] -= A[ii][jj] * C[i][ii] * C[j][jj]; } } } int n, m; while (~scanf("%d%d", &n, &m)){ OT(int(A[n][m])); } }
正常向冗斥:
f(i) 表示:至少 i 行是空的方案数。
//}/* .................................................................................................................................. */ const int N = int(50) + 9; Int C[N][N]; int n, m; Int f(int i){ return pow(pow(Int(2), n-i)-1, m) * C[n][i]; } int main(){ #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); #endif REP(i, N){ C[i][0] = 1; REP_1(j, i) C[i][j] = C[i-1][j-1] + C[i-1][j]; } while (~scanf("%d%d", &n, &m)){ Int z = 0; REP(i, n+1){ if (i&1) z -= f(i); else z += f(i);; } OT(int(z)); } }
Problem C.
http://acm.hust.edu.cn/vjudge/problem/viewSource.action?id=3135282
Problem D.
http://acm.hust.edu.cn/vjudge/problem/viewSource.action?id=3135430