PersonalCorpus 版 (精华区)


//1Y 

//3210 2003/09/01 12:53:28.046 Accepted 0:00.006 64 C++ 2722 - Light Bulbs 
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "ctype.h"
#include "string.h"
#include "memory.h"

#define LI4SIZE 200
#define EPS     1e-16
struct LI4{
    int a[LI4SIZE];
    int len;
    int sign; // 1 for positive, and 0 for negative
};


struct LF4{
    struct LI4 f;
    int sign,rank;// f/(10^rank)
};

/***********************************************************/

void LI4_set0L(struct LI4 *des);
void LI4_set1L(struct LI4 *des);
void LI4_copyLL(struct LI4 *des,struct LI4 *src);
void LI4_addLL(struct LI4 *des, struct LI4 *src);
void LI4_addL3(struct LI4 *des, struct LI4 *src1, struct LI4 *src2);
void LI4_mulLI(struct LI4 *des, int src);
void LI4_mulLLI(struct LI4 *des, struct LI4 *src1, int src2);
void LI4_shl4LI(struct LI4 *des, int src);
void LI4_shr4LI(struct LI4 *des, int src);
void LI4_mulLL(struct LI4 *des, struct LI4 *src);
void LI4_mulL3(struct LI4 *des, struct LI4 *src1, struct LI4 *src2);
void LI4_printfL(struct LI4 *des);
void LI4_sprintfSL(char *buf, struct LI4 *des);
void LI4_sscanfSL(char *buf, struct LI4 *des);
int LI4_strlenL(struct LI4 *des);
void LI4_divLII(struct LI4 *des, int src, int &mod);
int LI4_abscmpLL(const void *a, const void *b);
int LI4_cmpLL(const void *a, const void *b);
void LI4_abssubLL(struct LI4 *des, struct LI4 *src);
int LI4_is0L(struct LI4 *des);
int LI4_getrank4L(struct LI4 *des);

/***********************************************************/
int  LF4_is0F(struct LF4 *des);
void LF4_cuttail0F(struct LF4 *des);
void LF4_set0F(struct LF4 *des);
void LF4_set1F(struct LF4 *des);
void LF4_copyFF(struct LF4 *des, struct LF4 *src);
void LF4_addFF(struct LF4 *des, struct LF4 *src);
void LF4_addF3(struct LF4 *des, struct LF4 *src1, struct LF4 *src2);
void LF4_mulFd(struct LF4 *des, double src);
void LF4_mulFFd(struct LF4 *des, struct LF4 *src1, double src2);
void LF4_shlFi(struct LF4 *des, int src);
void LF4_shrFi(struct LF4 *des, int src);
void LF4_mulFF(struct LF4 *des, struct LF4 *src);
void LF4_mulF3(struct LF4 *des, struct LF4 *src1, struct LF4 *src2);
void LF4_sprintfSF(char *buf, struct LF4 *des);

/***********************************************************/

int  LF4_is0F(struct LF4 *des)
{
    return LI4_is0L(&(des->f));
}

/***********************************************************/

void LF4_cuttail0F(struct LF4 *des)
{
    int i;
    
    i = LI4_getrank4L(&(des->f));
    des->rank -= 4 * i;
    LI4_shr4LI(&(des->f),i);
}

/***********************************************************/

void LF4_set0F(struct LF4 *des)
{
    LI4_set0L(&(des->f));
    des->sign=1;
    des->rank=0;
}
/***********************************************************/
void LF4_set1F(struct LF4 *des)
{
    LI4_set1L(&(des->f));
    des->sign=1;
    des->rank=0;
}
/***********************************************************/
void LF4_copyFF(struct LF4 *des, struct LF4 *src)
{
    LI4_copyLL(&(des->f), &(src->f));
    des->sign = src->sign;
    des->rank = src->rank;
}   
/***********************************************************/
void LF4_addFF(struct LF4 *des, struct LF4 *src)
{
    int k;
    if (des->rank > src->rank) {
        k=des->rank - src->rank;
        LI4_shl4LI(&(des->f),k/4);
        switch(k%4) {
            case 1: LI4_mulLI(&(des->f),10);    break;
            case 2: LI4_mulLI(&(des->f),100);   break;
            case 3: LI4_mulLI(&(des->f),1000);  break;
        }
        des->rank = src->rank;
    } else if (des->rank < src->rank) {
        k=src->rank - des->rank;
        LI4_shl4LI(&(src->f),k/4);
        switch(k%4) {
            case 1: LI4_mulLI(&(src->f),10);    break;
            case 2: LI4_mulLI(&(src->f),100);   break;
            case 3: LI4_mulLI(&(src->f),1000);  break;
        }
        src->rank = des->rank;
    }
    
    des->f.sign = des->sign;
    src->f.sign = src->sign;
    LI4_addLL(&(des->f),&(src->f));
    des->sign = des->f.sign;
    des->f.sign = 1;
    src->f.sign = 1;
    LF4_cuttail0F(des);
}
        
/***********************************************************/

void LF4_addF3(struct LF4 *des, struct LF4 *src1, struct LF4 *src2)
{
    LF4_copyFF(des,src1);
    LF4_addFF(des,src2);
}

/***********************************************************/

void LF4_mulFd(struct LF4 *des, double src)
{
    char s[24];
    int k;
    struct LI4 temp;
    double d;
    
    if (LI4_is0L(&(des->f))||(src==0)) {
        LF4_set0F(des);
        return;
    }
    
    if (src<0) {
        src = -src;
        des->sign = 1 - des->sign;
    }
    for (k=0,d=1;src*d-floor(src*d)>EPS;k++,d*=10);
    sprintf(s,"%.0lf",src*d);
    LI4_sscanfSL(s,&temp);
    LI4_mulLL(&(des->f),&temp);
    des->rank += k;
    LF4_cuttail0F(des);
}   

/***********************************************************/

void LF4_mulFFd(struct LF4 *des, struct LF4 *src1, double src2)
{
    LF4_copyFF(des,src1);
    LF4_mulFd(des, src2);
}

/***********************************************************/

void LF4_shlFi(struct LF4 *des, int src)
{
    if (LF4_is0F(des)||(src<=0)) return;
    des->rank -= src;
}

/***********************************************************/

void LF4_shrFi(struct LF4 *des, int src)
{
    if (LF4_is0F(des)||(src<=0)) return;
    des->rank += src;
}

/***********************************************************/

void LF4_mulFF(struct LF4 *des, struct LF4 *src)
{
    if (LF4_is0F(des)||LF4_is0F(src)) {
        LF4_set0F(des);
        return;
    }
    if (des->sign == src->sign) des->sign = 1; else des->sign = 0;
    LI4_mulLL(&(des->f),&(src->f));
    des->rank += src->rank;
    LF4_cuttail0F(des);
}   

/***********************************************************/

void LF4_mulF3(struct LF4 *des, struct LF4 *src1, struct LF4 *src2)
{
    LF4_copyFF(des,src1);
    LF4_mulFF(des, src2);
}

/***********************************************************/

void LF4_printfF(struct LF4 *des)
{
    
}

/***********************************************************/

void LF4_sprintfSF(char *buf, struct LF4 *des)
{
    int i,j,k;
    
    LI4_sprintfSL(buf,&(des->f));
    k=strlen(buf);
    if(des->rank<0) {
        for (i=0,j=k;i>des->rank;i--,j++) buf[j]='0';
        buf[j]=0;
        k-=des->rank;
    } else if(des->rank>0) {
        if (des->rank>=k) {
            j=des->rank-k+2;
            for (i=k;i>=0;i--) buf[i+j]=buf[i];
            for (i=2;i<j;i++) buf[i]='0';
            buf[0]='0'; buf[1]='.';
            k+=j;
        } else {
            j=k-des->rank;
            for (i=k;i>=j;i--) buf[i+1]=buf[i];
            buf[j]='.';
            ++k;
        }
    } else {
        buf[k++]='.';
        buf[k]=0;
    }
    for (i=k-1;i>0;i--) if ((buf[i]!='0')||(buf[i]=='.')) break;
    
    //if (buf[i]=='.') buf[i]=0; else buf[i+1]=0;
    buf[i+1]=0;
}   
    
            
    
            
        
            
            
            
        
    
    
/***********************************************************/
/***********************************************************/
/***********************************************************/

void LI4_set0L(struct LI4 *des)
{
    memset(des,0,sizeof(struct LI4));
    des->sign=1;
    des->len=1;
}

/***********************************************************/

void LI4_set1L(struct LI4 *des)
{
    LI4_set0L(des);
    des->a[0]=1;
}

/***********************************************************/

void LI4_copyLL(struct LI4 *des,struct LI4 *src)
{
    memcpy(des->a, src->a, src->len*4);
    des->len=src->len;
    des->sign=src->sign;
}

/***********************************************************/

void LI4_addLL(struct LI4 *des, struct LI4 *src)
{
    int i,j,k;
    struct LI4 temp;

    if (des->sign==src->sign) {
        k=0; i=0;
        while ((i<des->len)||((i<src->len))) {
            des->a[i]+=src->a[i];
            des->a[i]+=k;
            k=des->a[i]/10000;
            des->a[i]%=10000;
            i++;
        }
        if (k!=0) { des->a[i]=k; i++; }
        des->len=i;
    } else {
        k=LI4_abscmpLL(des,src);
        if (k==0) {
            LI4_set0L(des);
            return;
        } else if (k>0) {
            LI4_abssubLL(des,src);
        } else {
            k=des->sign;
            LI4_copyLL(&temp,src);
            LI4_abssubLL(&temp,des);
            LI4_copyLL(des,&temp);
            des->sign=1-k;
        }
    }
}

/***********************************************************/

void LI4_addL3(struct LI4 *des, struct LI4 *src1, struct LI4 *src2)
{
    LI4_copyLL(des,src1);
    LI4_addLL(des,src2);
}

/***********************************************************/

void LI4_mulLI(struct LI4 *des, int src)
{
    int i,j,k;

    k=0; i=0;
    while ((i<des->len)||(k>0)) {
        des->a[i]*=src;
        des->a[i]+=k;
        k=des->a[i]/10000;
        des->a[i]%=10000;
        i++;
    }
    des->len=i;
}

/***********************************************************/

void LI4_mulLLI(struct LI4 *des, struct LI4 *src1, int src2)
{
    LI4_copyLL(des,src1);
    LI4_mulLI(des,src2);
}

/***********************************************************/

void LI4_shl4LI(struct LI4 *des, int src)
{
    int i;
    
    if (src<=0) return;
    for (i=des->len-1;i>=0;i--)
        des->a[i+src]=des->a[i];
    for (i=0;i<src;i++) des->a[i]=0;
    des->len+=src;
}

/***********************************************************/

void LI4_shr4LI(struct LI4 *des, int src)
{
    int i;
    
    if (src>=des->len) {
        LI4_set0L(des);
        return;
    }
    if (src<=0) return;
    for (i=src;i<des->len;i++) 
        des->a[i-src]=des->a[i];
    for (i=des->len-src;i<des->len;i++) des->a[i]=0;
    des->len-=src;
}

/***********************************************************/

void LI4_mulLL(struct LI4 *des, struct LI4 *src)
{
    int i,j,k;
    struct LI4 temp1,temp2;

    LI4_set0L(&temp2);
    for (i=0;i<src->len;i++) {
        LI4_set0L(&temp1);
        LI4_mulLLI(&temp1,des,src->a[i]);
        LI4_shl4LI(&temp1,i);
        LI4_addLL(&temp2,&temp1);
    }
    LI4_copyLL(des,&temp2);
}

/***********************************************************/

void LI4_mulL3(struct LI4 *des, struct LI4 *src1, struct LI4 *src2)
{
    LI4_copyLL(des,src1);
    LI4_mulLL(des,src2);
}

/***********************************************************/

void LI4_printfL(struct LI4 *des)
{
    int i;

    if (des->len<=0) return;
    if (LI4_is0L(des)) { printf("0"); return; }

    if (des->sign==0) printf("-");
    i=des->len-1;
    printf("%d",des->a[i]);
    while (i>0) {
        i--;
        if (des->a[i]<1000) printf("0");
        if (des->a[i]<100) printf("0");
        if (des->a[i]<10) printf("0");
        printf("%d",des->a[i]);
    }
}

/***********************************************************/

void LI4_sprintfSL(char *buf, struct LI4 *des)
{
    int i,j,k;
    if (des->len<=0) return;
    buf[0]=0;

    for (i=des->len-1;i>=0;i--)  if (des->a[i]>0) {
        sprintf(buf+strlen(buf),"%d",des->a[i]);
        break;
    }
    if (i<0) {
        sprintf(buf+strlen(buf),"0");
        return;
    }
    for (j=i-1;j>=0;j--) {
        if (des->a[j]<1000) sprintf(buf+strlen(buf),"0");
        if (des->a[j]<100) sprintf(buf+strlen(buf),"0");
        if (des->a[j]<10) sprintf(buf+strlen(buf),"0");
        sprintf(buf+strlen(buf),"%d",des->a[j]);
    }
}

/***********************************************************/

void LI4_sscanfSL(char *buf, struct LI4 *des)
{
    int i,j,k,p[4]={1,10,100,1000};
    j=0;k=0;
    LI4_set0L(des);

    for (i=strlen(buf)-1;(i>=0)&&(isdigit(buf[i]));i--) {
        des->a[k]+=(buf[i]-48)*p[j];
        if (j==3) { j=0; k++;} else j++;
    }
    if (i>=0)
        if (buf[i]=='-') des->sign=0; else des->sign=1;
    while ((des->a[k]==0)&&(k>0)) k--;
    des->len=k+1;
}

/***********************************************************/

int LI4_strlenL(struct LI4 *des)
{
    char buf[100000];
    LI4_sprintfSL(buf,des);
    return strlen(buf);
}

/***********************************************************/

void LI4_divLII(struct LI4 *des, int src, int &mod)
{
    int i,k,j;
    if (des->len==0) {
        mod = 0;
        return;
    }
    k=0;
    for (i=des->len-1;i>=0;i--) {
        des->a[i]+=k*10000;
        k=des->a[i]%src;
        des->a[i]/=src;
    }
    mod=k;
    for (i=des->len-1; i>0;i--)
        if (des->a[i]!=0) break;
    des->len = i+1;
}

/***********************************************************/

int LI4_abscmpLL(const void *a, const void *b)
{
    struct LI4 *x=(struct LI4 *)a;
    struct LI4 *y=(struct LI4 *)b;

    if (x->len>y->len) return 1;
    if (x->len<y->len) return -1;
    if (x->a[x->len-1]>y->a[y->len-1]) return 1;
    if (x->a[x->len-1]<y->a[y->len-1]) return -1;
    return 0;
}

/***********************************************************/

int LI4_cmpLL(const void *a, const void *b)
{
    struct LI4 *x=(struct LI4 *)a;
    struct LI4 *y=(struct LI4 *)b;

    if (x->sign > y->sign) return 1;
    if (x->sign < y->sign) return -1;
    if (x->sign == 1) return LI4_abscmpLL(a,b); else return - LI4_abscmpLL(a,b);
}

/***********************************************************/

void LI4_abssubLL(struct LI4 *des, struct LI4 *src)
{
    int i,j,k;

    k=0;
    for (i=0;i<des->len;i++) {
        if ((des->a[i]-=src->a[i]+k)<0) {
            des->a[i]+=10000;
            k=1;
        } else k=0;
    }
    for (i=des->len-1;(i>=0)&&(des->a[i]==0);i--) ;
    if (i<0) des->len=1; else des->len=i+1;
}

/***********************************************************/

int LI4_is0L(struct LI4 *des)
{
    if ((des->len==1)&&(des->a[0]==0)) return 1; else return 0;
}

/***********************************************************/

int LI4_getrank4L(struct LI4 *des)
{
    int i;
    
    if (LI4_is0L(des)) return 0;
    for (i=0;i<des->len;i++) if (des->a[i]) break;
    return i;
}



void main()
{

#ifndef ONLINE_JUDGE
    freopen ("i","r",stdin);freopen ("o","w",stdout);
#endif

    struct LI4 q,one;
    char s[400],*t,a[400],b[400];
    int dp[400][2][2],i,j,k,la,lb,tot=0;    
    while (gets(s)) {
        la=lb=0;
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        t=strtok(s," ");
        LI4_sscanfSL(t,&q);
        while (!LI4_is0L(&q)) {
            LI4_divLII(&q,2,k); a[la++]=k;
        }
        t=strtok(NULL," ");
        LI4_sscanfSL(t,&q);
        while (!LI4_is0L(&q)) {
            LI4_divLII(&q,2,k); b[lb++]=k;
        }
        if ((la==0)&&(lb==0)) break;
        if (la<lb) la=lb;
        for (i=0;i<la;i++) a[i]^=b[i];

        memset(dp,50,sizeof(dp));
        dp[0][1][1]=1;
        dp[0][0][0]=0;

        for (i=1;i<la;i++) {
            dp[i][0][0]=dp[i-1][0][a[i-1]];
            dp[i][0][1]=dp[i-1][1][a[i-1]];
            dp[i][1][0]=dp[i-1][1][1-a[i-1]]+1;
            dp[i][1][1]=dp[i-1][0][1-a[i-1]]+1;
        }
        if (tot) printf("\n");
        printf("Case Number %d: ",++tot);
        if ((dp[la-1][0][a[la-1]]>400)&&(dp[la-1][1][a[la-1]]>400)) {
            printf("impossible\n"); 
            continue;
        }
        
        if (dp[la-1][0][a[la-1]]>dp[la-1][1][a[la-1]]) j=1; else j=0;
        k=a[la-1];
        LI4_set0L(&q);
        LI4_set1L(&one);
        for (i=la-1;i>0;i--) {
            LI4_mulLI(&q,2);
            if (j==1) { LI4_addLL(&q,&one); j=1-k; k=1-a[i-1]; } else { j=k; k=a[i-1]; }
        }
        LI4_mulLI(&q,2); if (j==1) LI4_addLL(&q,&one); 
        LI4_printfL(&q);
        printf("\n");
    }
}
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:212.498毫秒