| ||||||||||
Number SequenceTime Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 150 Accepted Submission(s): 73 Special Judge
Problem Description
There is a special number sequence which has n+1 integers. For each number in sequence, we have two rules:
● a i ∈ [0,n] ● a i ≠ a j( i ≠ j ) For sequence a and sequence b, the integrating degree t is defined as follows(“⊕” denotes exclusive or): (sequence B should also satisfy the rules described above) Now give you a number n and the sequence a. You should calculate the maximum integrating degree t and print the sequence b.
Input
There are multiple test cases. Please process till EOF.
For each case, the first line contains an integer n(1 ≤ n ≤ 10 5), The second line contains a 0,a 1,a 2,...,a n.
Output
For each case, output two lines.The first line contains the maximum integrating degree t. The second line contains n+1 integers b
0,b
1,b
2,...,b
n. There is exactly one space between b
i
and b
i+1
(0 ≤ i ≤ n - 1). Don’t ouput any spaces after b
n.
Sample Input
Sample Output
|
找二进制互补的数进行匹配
0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 10000
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
可以发现,15和16互补,(14,1)(13,2)...也就是他们互补后为1111,即15,所以只要这样进行,就不会有浪费的1
#include<stdio.h>
#include<algorithm>
#include<string.h>
#define N 100010
using namespace std;
typedef long long LL;
LL i,j,k,m,n,x,y,z,sum;
LL a[N],b[N];
int main()
{
while(scanf("%I64d",&n)!=EOF)
{
for(i=0;i<=n;i++)scanf("%I64d",&b[i]);
sum=0;
memset(a,0,sizeof(a));m=n;
while(n>0)
{
k=0;
for (i=20; i>=0; i--)
if ((n&(1<<i))!=0)
{
k=1<<i;
break;
}
sum+=(n-k+1)*(k*2-1)*2;
for (i=n;i+n>=(k*2-1);i--)
a[i]=k*2-1-i;
n-=(n-k+1)*2;
}
printf("%I64d\n",sum);
for (i=0;i<m;i++)printf("%I64d ",a[b[i]]);
printf("%I64d\n",a[b[m]]);
}
return 0;
}