标签:pre i+1 描述 ret 有一个 cout 长度 进制 problem
给定一个长度为 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
一个非负正数,表示答案
3 1 2 3
288230376151711744
给一个数n,和n个数,(n<=50,a[i]<=2^60)有一个数s,让s xor a[i]<=s xor a[i+1]
对于2个二进制数比如
00011110111
00011111111
它们前7位相同,第8位不同,如果让s满足s xor a[i]<=s xor a[i+1]
那么,他们第8位对应的s那一位也就确定了
这样将a[i]和a[i+1]遍历一遍,就可以得到s中一共有几位数已经被确定了。
又因为s中一共有60位数,所以就可以得到s中有多少位不确定,每一个不确定的位有0和1两种可能,设不确定的位数为x,那么s一共有2的x次方种可能。
1 #include<iostream> 2 using namespace std; 3 #include<queue> 4 #include<cstdio> 5 #include<map> 6 #include<set> 7 typedef long long LL; 8 LL a[100]; 9 int b1[100],b2[100]; 10 int v[100]; 11 void deal(LL a,LL b) 12 { 13 for (int i=1;i<=60;i++)//求a的各2进制位 14 { 15 b1[i]=a%2; 16 a/=2; 17 } 18 for (int i=1;i<=60;i++)//求b的各2进制位 19 { 20 b2[i]=b%2; 21 b/=2; 22 } 23 int ans; 24 for (int i=60;i>=1;i--)//找到第一个不相同的位,存在ans里 25 { 26 if (b1[i]==b2[i]) continue; 27 ans=i; 28 break; 29 } 30 v[ans]=1;//将这一位做上标记 31 } 32 int main() 33 { 34 int n; 35 cin>>n; 36 for (int i=1;i<=n;i++) 37 { 38 scanf("%lld",&a[i]); 39 } 40 for (int i=1;i<=n-1;i++) 41 { 42 deal(a[i],a[i+1]); 43 } 44 LL ans=0; 45 for (int i=1;i<=60;i++) 46 { 47 if (v[i]) continue; 48 ans++;//计算不确定的位数共有几个 49 } 50 //cout<<ans<<endl; 51 ans=(LL)1<<ans;//答案为2^ans 52 cout<<ans<<endl; 53 return 0; 54 }
标签:pre i+1 描述 ret 有一个 cout 长度 进制 problem
原文地址:http://www.cnblogs.com/xfww/p/7270681.html