OR

OR

题意:

​ 给定两个数组b和c, b=(b2,b3,…,bn) c=(c2,c3,…,cn),a数组被认为是美丽的,如果ai|ai-1=bi,ai+ai-1=ci;计算美丽序列的数量。
OR

思路:

​ 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;
}
上一篇:欧几里得算法


下一篇:Redis2-string和bitmap