https://vjudge.net/problem/HDU-6513
题目大意:
01矩阵,可以选1个或两个子矩阵进行翻转,问一共可以产生多少种矩阵。
思路:
容斥原理
重复2,1, 3, 4
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m;
ll C(ll n, ll m) {
if( n < m ) return 0;
ll ret = 1;
ll dd = 1;
for(ll t = n; t > n - m; t--) ret*=t;
for(ll t = 1; t <= m; t++) dd*=t;
return ret / dd;
}
char s[111];
int main()
{
// freopen("i.txt","r",stdin);
while(~scanf("%lld%lld", &n, &m) ) {
for(int i = 0; i < n; i++) scanf("%s", s);
ll ans = C(n+1,2)*C(m+1,2); // 选一个矩阵
ans += C(ans, 2); // 选两个矩阵
ans -= C(n+1,2)*C(m+1,2)*(n + m - 2); // 重复1
ans -= 2*C(n + 1, 2) * C(m + 1, 4) + 2 * C(m + 1, 2) * C(n + 1, 4); // 重复 2
ans -= 12 * C(n + 1, 3) * C(m + 1, 3); // 重复3,4
printf("%lld\n", ans + 1);
}
return 0;
}