简述
这题很有趣的 随便打两个二进制数
100100100100101100123456789
第三行是下标,方便描述。
二进制数比较肯定是字典序,从最高位开始比较,直到遇到第一个不一样的位,这个位上哪个数等于
1
哪个数就较大。
想要构造一个
S,异或上之后第一个数大于第二个数,显然从前往后比较的时候,一开始连续相同的位即使同时异或上一个数,也不会改变他们的大小关系。对于第一个不相等的位,比如上面的
6
这一位,想要让后面大于前面,
S
中这一位就必须是
0,我如果把上下两个数交换,新情形下
S
的这一位就必须是
1,确定了
S
的这一位之后,后面的就没有限制了。
那么就每两个相邻的数搞一搞,如果有冲突就直接输出
0,否则输出
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;
}