OR
题意:
给定两个数组b和c, b=(b2,b3,…,bn) c=(c2,c3,…,cn),a数组被认为是美丽的,如果ai|ai-1=bi,ai+ai-1=ci;计算美丽序列的数量。
思路:
ci=ai-1+ai=ai-1 or ai + ai-1 and ai
因此实际上是给出了相邻两位或、且的结果,询问有多少个ai序列满足要求
考虑每一位分开考虑。注意到,在这种情况下a1的取值能够确定整个序列,因此枚举a1的取值即可。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n;
const int N=1e5+10;
int b[N],c[N];
bool check(int x,int k){
for(int i=2;i<=n;i++){
int k1=(b[i]>>k)&1;
int k2=(c[i]>>k)&1;
if(k1&&!k2){
x^=1;
}
if(k1&&k2&&!x){
return false;
}
if(!k1&&!k2&&x){
return false;
}
if(!k1&&k2){
return false;
}
}
return true;
}
signed main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin>>n;
for(int i=2;i<=n;i++){
cin>>b[i];
}
for(int i=2;i<=n;i++){
cin>>c[i];//ci=ai-1+ai=ai-1 or ai + ai-1 and ai
}
for(int i=2;i<=n;i++){
c[i]-=b[i];//ci=ai&ai-1;
if(c[i]<0){
cout<<"0"<<endl;
return 0;
}
}
int res=1,flag=1;
for(int i=0;i<=31;i++){//枚举a1当前位置是0还是1
if(!check(0,i)&&!check(1,i)){
flag=0;
break;
}
if(check(0,i)&&check(1,i)){
res<<=1;
}
}
if(flag) cout<<res<<endl;
else cout<<"0"<<endl;
return 0;
}