时间限制:
10000ms
单点时限:
1000ms
内存限制:
256MB
-
3 1 2 3
样例输出
-
288230376151711744
描述
给定一个长度为 n 的非负整数序列 a[1..n]
你需要求有多少个非负整数 S 满足以下两个条件:
(1).0 ≤ S < 260
(2).对于所有 1 ≤ i < n ,有 (a[i] xor S) ≤ (a[i+1] xor S)
输入
第一行一个正整数 n
第二行 n 个非负整数表示序列 a[1..n]
1 ≤ n ≤ 50
0 ≤ a[i] < 260
输出
一个非负正数,表示答案
比如
a:1010110
b:1011110
b和a第四位不同,b的第四位是1,a的第四位是0,如果要b>a,那么S的第四位就是0,如果a>b 那么S的第四位就是1。
题目要问符合条件的数有多少个,那么就推这样的限制条件有多少个,然后输出2^(没有限制的位数),如果出现了S既要为0又要为1的情况,直接输出0;
#include<stdio.h>
#include<algorithm>
#include<string.h>
#define ll long long
using namespace std;
int main()
{
long long n,a,b,flag[60];
long long i,j;
for(i=0;i<60;i++)
flag[i]=-1;
scanf("%lld",&n);
scanf("%lld",&a);
for(i=1;i<n;i++,a=b)
{
scanf("%lld",&b);
for(j=59;j>=0;j--)
{
if((b^a)&(1ll<<j))
{
if(a&(1ll<<j))
{
if(flag[j]==0)
{
printf("0\n");
return 0;
}
if(flag[j]==-1)
{
flag[j]=1;
}
}
else
{
if(flag[j]==1)
{
printf("0\n");
return 0;
}
if(flag[j]==-1)
{
flag[j]=0;
}
}
break;
}
}
}
long long ans=1;
for(i=0;i<60;i++)
if(flag[i]==-1)
ans<<=1;
printf("%lld\n",ans);
return 0;
}