51nod 特殊表示法

#include<bits/stdc++.h>
using namespace std;
#define N 1001000
inline void read(int &a){
	char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	a=ch-'0';
}
int n,m,ne;
int a[N],b[N];
char ans[N*2];
int fib[10]={1,2,3,5,8,13,21,34,55,89};
void dow(int p){
	n=max(n,p+1);
	while(a[p+1]>0&&a[p]>0) --a[p],--a[p+1],++a[p+2],dow(p+2);
	while(a[p]>0&&a[p-1]>0) --a[p],--a[p-1],++a[p+1],dow(p+1);
	if(p>1){
		while(a[p]>=2){
			a[p]-=2;
			a[p-2]++,a[p+1]++;
			dow(p+1);
		}
	}
}
void cle(){
	for(int i=n-1;i>=2;i--){
		while(a[i]>=2){
			a[i]-=2;
			a[i-2]++,a[i+1]++;
			n=max(n,i+2);
			dow(i);
		}
	}
	for(int i=n-1;i>0;i--){
		dow(i);
	}
}
int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++) read(a[i]);
	scanf("%d",&m);
	for(int i=0;i<m;i++) read(b[i]),a[i]+=b[i];
	n=max(n,m);
	cle();
	int free=a[1]*2+a[0];
	a[0]=a[1]=0;
	for(int i=9;i>=0;i--){
		if(free>=fib[i]){
			a[i]++,free-=fib[i];
		}
	}
	cle();
	printf("%d\n",n);
	int len=0;
	for(int i=0;i<n;i++){
		ans[len++]=a[i]+'0';
		ans[len++]=' ';
	}
	printf("%s\n",ans);
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章