简述
这题很有趣的
随便打两个二进制数
100100100100101100123456789
第三行是下标,方便描述。
二进制数比较肯定是字典序,从最高位开始比较,直到遇到第一个不一样的位,这个位上哪个数等于 1 哪个数就较大。
想要构造一个
那么就每两个相邻的数搞一搞,如果有冲突就直接输出
2没有限制的位的个数
代码
//数学
#include <cstdio>
#include <algorithm>
#define maxn 100
#define ll long long
using namespace std;
ll a[maxn], N, cnt[maxn];
int main()
{
ll i, j, last, now, ans=1;
scanf("%lld%lld",&N,&last);
for(i=0;i<=59;i++)cnt[i]=-1;
for(i=2;i<=N;i++,last=now)
{
scanf("%lld",&now);
for(j=59;j>=0;j--)
if((last^now)&(1ll<<j))
{
if(last&(1ll<<j))
{
if(cnt[j]==-1)cnt[j]=1;
if(cnt[j]==0){printf("0");return 0;}
}
else
{
if(cnt[j]=-1)cnt[j]=0;
if(cnt[j]==1){printf("0");return 0;}
}
break;
}
}
for(i=0;i<=59;i++)if(cnt[i]==-1)ans<<=1;
printf("%lld",ans);
return 0;
}