andy0130tw
9/7/2015 - 10:15 AM

HOJ 52 瀚瀚數列 @ 2013-02-18 20:14:18

HOJ 52 瀚瀚數列 @ 2013-02-18 20:14:18

#include<iostream>
#define MAX 1000100
using namespace std;
  
int n[1000000],m[1000000],ans[MAX];
int nd,md,ansd;
int main(){
    cin>>nd;
    for(int i=0;i<nd;i++)cin>>n[i];
    cin>>md;
    for(int i=0;i<md;i++)cin>>m[i];
    ansd=max(nd,md);
    for(int i=0;i<ansd;i++)ans[i]=n[i]+m[i];
    for(int i=ansd;i<MAX;i++)ans[i]=0;
     
    for(int i=ansd;i>=0;i--){
        //2*H(n)=H(n-2)+H(n+1)
        if(ans[i]>=2){
            if(i==0){ans[0]-=2;ans[1]++;}
            else if(i==1){ans[1]-=2;ans[0]++;ans[2]++;}
            else if(ans[i-1]==0&&ans[i+1]==0){
                ans[i]-=2;ans[i-2]++;ans[i+1]++;
            }
        }
        if(ans[ansd]>=1)ansd++;
    }
      
    int ok=0;    
    while(!ok){
        for(int i=ansd;i>=0;i--){
            if(ans[i]>=1&&ans[i+1]>=1){
                ans[i]--;ans[i+1]--;ans[i+2]++;
            }
            if(ans[ansd]>=1)ansd++;
        }
        ok=1;
        for(int i=0;i<ansd;i++){
            if(ans[i]>1||(ans[i]>=1&&ans[i+1]>=1)){
                ok=0;
            }
        }
    }
      
    //處理最後進位
    /*if(ans[ansd-2]==1&&ans[ansd-1]==1){
        ans[ansd-2]--;ans[ansd-1]--;ans[ansd]++;
        ansd++;
    }*/
    cout<<ansd;
    for(int i=0;i<ansd;i++){
        assert(ans[i]==0||ans[i]==1);
        cout<<" "<<ans[i];
    }
}