题目大意:有个数列
{
a
n
}
\{a_n\}
{an},告诉你
{
b
n
}
,
b
k
=
∑
i
=
1
n
a
i
and
a
k
\{b_n\},b_k=\sum_{i=1}^na_i\text{ and }a_k
{bn},bk=∑i=1nai and ak,以及
{
c
n
}
,
c
k
=
∑
i
=
1
n
a
i
or
a
k
\{c_n\},c_k=\sum_{i=1}^na_i\text{ or }a_k
{cn},ck=∑i=1nai or ak,判断是否有解以及求
{
a
n
}
,
n
≤
1
0
5
\{a_n\},n\le10^5
{an},n≤105
题解:注意到
a
and
b
+
a
or
b
=
a
+
b
a\text{ and }b+a\text{ or }b=a+b
a and b+a or b=a+b,因此把b和c加起来算一算就能直接求出来a,最后判一下是否合法即可……
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define Rep(i,v) rep(i,0,(int)v.size()-1)
#define lint long long
#define ull unsigned lint
#define db long double
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define gc getchar()
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
using namespace std;
typedef pair<int,int> pii;
typedef set<int>::iterator sit;
inline int inn()
{
int x,ch;while((ch=gc)<'0'||ch>'9');
x=ch^'0';while((ch=gc)>='0'&&ch<='9')
x=(x<<1)+(x<<3)+(ch^'0');return x;
}
const int N=200010;int a[N],b[N],c[N],cnt[100];
inline int check(int n)
{
rep(j,0,31) rep(i,1,n) cnt[j]+=(a[i]>>j)&1;
rep(i,1,n)
{
lint res=0;
rep(j,0,31) if((a[i]>>j)&1) res+=(1ll<<j)*cnt[j];
if(res^b[i]) return 0;
}
rep(i,1,n)
{
lint res=0;
rep(j,0,31) if((a[i]>>j)&1) res+=(1ll<<j)*n;else res+=(1ll<<j)*cnt[j];
if(res^c[i]) return 0;
}
return 1;
}
int main()
{
int n=inn();lint s=0,x;
rep(i,1,n) b[i]=inn(),s+=b[i];
rep(i,1,n) c[i]=inn(),s+=c[i];
if(s%(2*n)!=0) return !printf("-1\n");s/=2*n;
rep(i,1,n)
if((x=b[i]+c[i]-s)%n==0) a[i]=int(x/n);
else return !printf("-1\n");
rep(i,1,n) if(a[i]<0) return !printf("-1\n");
if(!check(n)) return !printf("-1\n");
rep(i,1,n) printf("%d ",a[i]);
return !printf("\n");
}