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];
}
}