思路:转自别人的题解:
分析:只要知道 a[i]+a[j]=a[i]|a[j]+a[i]&a[j] 就好做了,我们令 sum=∑ni=1a[i] ,然后我们会得到 c[i]=∑nj=1(a[i]+a[j])−b[i]=n∗a[i]+sum−b[i] 即 b[i]+c[i]=n∗a[i]+sum 然后就可以求出a数组啦,最后我们还要检查一下a数组是否能够使得b,c数组成立。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 200000+7;
#define LL long long
LL b[maxn],c[maxn],a[maxn];
int cnt[70];
int main()
{
int n;
LL sum = 0;
scanf("%d",&n);
for(int i = 1;i<=n;i++)scanf("%lld",&b[i]),sum+=b[i];
for(int i = 1;i<=n;i++)scanf("%lld",&c[i]),sum+=c[i];
if(sum%(2*n))
{
printf("-1\n");
return 0;
}
sum/=(2*n);
for(int i = 1;i<=n;i++)
{
if(c[i]+b[i]-sum<0 || (c[i]+b[i]-sum)%n)
{
printf("-1\n");
return 0;
}
a[i]=(c[i]+b[i]-sum)/n;
}
for(int i = 1;i<=n;i++)
for(int j = 0;j<60;j++)
if((a[i]>>j)&1)cnt[j]++;
for(int i = 1;i<=n;i++)
{
LL sumb = 0,sumc=0;
for(int j = 0;j<60;j++)
{
if((a[i]>>j)&1)
{
sumb+=cnt[j]*(1LL<<j);
sumc+=n*(1LL<<j);
}
else
sumc+=cnt[j]*1LL<<j;
}
if(sumb!=b[i] || sumc!=c[i])
{
printf("-1\n");
return 0;
}
}
for(int i = 1;i<=n;i++)
printf("%lld ",a[i]);
}
Anton goes to school, his favorite lessons are arraystudying. He usually solves all the tasks pretty fast, but this time the teacher gave him a complicated one: given two arrays b and c of length n, find array a, such that:
where a and b means bitwise AND, while a or b means bitwise OR.
Usually Anton is good in arraystudying, but this problem is too hard, so Anton asks you to help.
The first line of the input contains a single integers n (1 ≤ n ≤ 200 000) — the size of arrays b and c.
The second line contains n integers bi (0 ≤ bi ≤ 109) — elements of the array b.
Third line contains n integers ci (0 ≤ ci ≤ 109) — elements of the array c.
If there is no solution, print - 1.
Otherwise, the only line of the output should contain n non-negative integers ai — elements of the array a. If there are multiple possible solutions, you may print any of them.
4 6 8 4 4 16 22 10 10
3 5 1 1
5 8 25 14 7 16 19 6 9 4 25
-1