题目链接:
http://codeforces.com/problemset/problem/245/D
题目大意:
给一个矩阵b[i][j],对于矩阵中的每一个元素b[i][j],表示b[i][j]=a[i]&b[j],这里&符号是位运算符。要求根据给出的矩阵算出所有的a[i]。
思路:
把握&运算的特点,对于A&B,对于A与B中的某一位i,如果做&运算以后为1,可以肯定A和B在这一位上一定是1。对于a[1],既然给出了a[1]与其他a[i]的运算答案,就可以得到a[1]在各个位上的答案,那么a[1]也出来了,a[2]、a[3]……同理。
所以我可以建立一个二维数组,存下a[i]上每一位的数字(0或1),最后算出答案。
代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
int a[105][40];
void work(int i,int j,int x)
{
int k=0;
while(x)
{
int b=x%2;
if(a[i][k]==0)
a[i][k]=b;
if(a[j][k]==0) //i和j都要的,如果在这位上本身就是1了,就不必重复赋值了。
a[j][k]=b;
k++;
x=x/2;
}
return ;
}
int solve(int x)
{
int ans=0;
for(int i=0;i<40;i++)
{
ans=ans+a[x][i]*pow(2,i);
}
return ans;
}
int main()
{
int n,b[105][105],i,j,k;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&b[i][j]);
memset(a,0,sizeof(a));
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
{
work(i,j,b[i][j]); //存下每一位的信息
}
for(i=1;i<n;i++)
{
int ans=solve(i); //根据各个位上的数算出这个数是多少
printf("%d ",ans);
}
printf("%d\n",solve(n));
}
return 0;
}