方格集数量
题目的思路还是比较简单的,直接把每一行、每一列0和1的个数存一下,然后计算即可。
但是这个题用到了一个奇妙的方法,就是1ll
计算2的n次方的时候,我们通常写成1 << n
但如果2的n次方超出了int的范围,我们需要将它转化为long long类型
这时,可以用1ll来解决
原本1 << n的写法,写成1ll << n即可实现转为ll
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = 60;
int a0[N],a1[N],b0[N],b1[N];
int main()
{
int n,m;
cin >> n >> m;
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= m;j ++)
{
int x;
cin >> x;
if(x)
a1[i] ++,b1[j] ++;
else
a0[i] ++,b0[j] ++;
}
ll ans = 0;
for(int i = 1;i <= n;i ++)
ans += (1ll << a0[i]) + (1ll << a1[i]) - 2;
for(int j = 1;j <= m;j ++)
ans += (1ll << b0[j]) + (1ll << b1[j]) - 2;
cout << ans - n * m;
return 0;
}