codeforces 244B Restoring Table(“&”位运算)

来源:互联网 发布:原生js实现的效果 编辑:程序博客网 时间:2024/06/11 05:05

题目链接:

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;}


0 0