AIM Tech Round 4 (Div. 2) B

来源:互联网 发布:胎儿b超数据 编辑:程序博客网 时间:2024/05/17 22:31

题目链接:点击打开链接

根据题意,只有成行或成列的同种颜色块可以组成一个集合

因此对于某行或某列,其形成的集合数即其所有取非0时的组合数的和

所以对于数目为n的某行或某列,其可以形成的组合数为2^n - 1

故只需在输入时统计其相同颜色数目即可

AC代码如下

#include <iostream>#include <cstring>#include <cstdio>using namespace std;long long M[51];void solve(){    M[0] = 1;    for(int i=1;i<=50;++i)    {        M[i] = M[i-1]*(long long)2;        //cout<<M[i]<<endl;    }}int main(){    solve();    long long cnt[51][4];    int n, m;    while(scanf("%d %d",&n,&m)!=-1)    {        memset(cnt,0,sizeof(cnt));        for(int i=1;i<=n;++i)            for(int j=1;j<=m;++j)        {            int temp;            scanf("%d",&temp);            if(temp)    cnt[i][2]++, cnt[j][3]++;            else   cnt[i][0]++, cnt[j][1]++;        }        long long ans = 0;        for(int i=1;i<=n;++i)        {            if(cnt[i][0])   ans +=(long long)M[cnt[i][0]] - 1;            if(cnt[i][2])   ans +=(long long)M[cnt[i][2]] - 1;        }        for(int i=1;i<=m;++i)        {            if(cnt[i][1])   ans +=(long long)M[cnt[i][1]] - 1;            if(cnt[i][3])   ans +=(long long)M[cnt[i][3]] - 1;        }        printf("%I64d\n",ans-n*m);    }    return 0;}


原创粉丝点击