题目链接
思路
我想大家都看了很多题解知道这道题的切入点是 c[i]=a[i-1]+a[i]=a[i-1] | a[i] a[i-1]&a[i],然后取看a1的第i位可以取0还是1,或者都可以取,只是对具体操作很迷,那么请看下面的注释!
AC代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5+9;
int b[N],c[N],d[N];
int main()
{
int n;
cin>>n;
for(int i=2; i<=n; i++) scanf("%d",b+i);
for(int i=2; i<=n; i++)
{
scanf("%d",c+i);
d[i]=c[i]-b[i];
if(d[i]<0)
{
puts("0");
return 0;
}
}
ll ans=1;
for(int i=0; i<31; i++)
{
int isok[3]={1,1};
for(int j=2; j<=n; j++)
{
int t0=0,t1=0;
int x=b[j]>>i&1;
int y=d[j]>>i&1;
if(!x&&!y) t0=isok[0];
else if(x&&y) t1=isok[1];
else if(x&&!y) t0=isok[1],t1=isok[0];
isok[0]=t0,isok[1]=t1;
if(!isok[0]&&!isok[1]) break;
}
ans*=1ll*(isok[1]+isok[0]);
}
printf("%lld",ans);
return 0;
}
|