P8053

· · 题解

首先,我们要知道 b_{i,j}=a_i=a_j 。 或者说我们把输入进去的数都看成二进制,我们就是在不断把 b_{i,j} 的数往 a_ia_j 上“套”。

比如说 a_1=001a_2=101b_{1,2}=111,由于 a_1 的第一二位和 a_2 的第二位没有 1,所以 a_1a_2 就都变成了 111,如果 b_{1,2}=001,那么 a_1a_2 就不会有改变。

能做到这些的就只有或。所以只用在输入的时候特判非0数字,再用 a_ia_jb_{i,j} 就可以了。

以下为代码


#include <bits/stdc++.h>
using namespace std;
long long n,mapp,a[100010];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>mapp;
            if(mapp!=0){
                a[i]|=mapp;
                a[j]|=mapp;
            }
        }
    }
    for(int i=1;i<=n;i++){
        cout<<a[i]<<" ";
    }
    return 0;
}