数学发现规律+hdu5014

来源:互联网 发布:剑灵捏脸数据人族 编辑:程序博客网 时间:2024/05/16 10:31

Online JudgeOnline ExerciseOnline TeachingOnline ContestsExercise AuthorF.A.Q
Hand In Hand
Online Acmers
Forum | Discuss
Statistical Charts

Problem Archive
Realtime Judge Status
Authors Ranklist
 
     C/C++/Java Exams     
ACM Steps
Go to Job
Contest LiveCast
ICPC@China
Best Coder beta
VIP | STD Contests
Virtual Contests 
    DIY | Web-DIY beta
Recent Contests
Author lee
Mail Mail 0(0)
Control Panel Control Panel 
Sign Out Sign Out
BestCoder官方群:385386683 欢迎加入~
寻人启事:2014级新生看过来!

Number Sequence

Time 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:

● ai ∈ [0,n] 
● ai ≠ aj( i ≠ j )

For sequence a and sequence b, the integrating degree t is defined as follows(“⊕” denotes exclusive or):

t = (a0 ⊕ b0) + (a1 ⊕ b1) +···+ (an ⊕ bn)


(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 ≤ 105), The second line contains a0,a1,a2,...,an.
 

Output
For each case, output two lines.The first line contains the maximum integrating degree t. The second line contains n+1 integers b0,b1,b2,...,bn. There is exactly one space between bi and bi+1(0 ≤ i ≤ n - 1). Don’t ouput any spaces after bn.
 

Sample Input
42 0 1 4 3
 

Sample Output
201 0 2 3 4


找二进制互补的数进行匹配

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 100010using 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;}




0 0
原创粉丝点击