定義斐波那契表示序列是用形如表示的序列
給定兩個長度爲的斐波那契最大表示序列,求它們和的斐波那契最大表示序列
定義更大的斐波那契序列是在長度更大的基礎上,字典序儘量大
數據範圍:
首先兩個表示序列先相加,然後重複以下操作直到序列中只有0或1(易證這樣的情況下是最優的)
對於相鄰的1,不斷做合併
對於各種的2,前後發散
由於在最壞條件下算法會跌落成,但是似乎也沒有什麼更好的解法了
於是就過掉了
#include<cctype>
#include<cstdio>
#include<algorithm>
#define LL long long
#define N 1000100
using namespace std;int n,m,a[N],l,b[N],t;
bool flag=1;
inline LL read()
{
char c;LL d=1,f=0;
while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;
while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;
return d*f;
}
signed main()
{
n=read();for(register int i=1;i<=n;i++) a[i]=read();
m=read();for(register int i=1;i<=m;i++) b[i]=read();
l=max(n,m)+30;
if(a[1]) b[!b[1]]=1;a[1]=0;
for(register int i=1;i<=l;i++) b[i]+=a[i];
while(flag)
{
for(register int i=1;i<=l;i++) if(b[i]&&b[i-1]) t=min(b[i],b[i-1]),b[i+1]+=t,b[i-1]-=t,b[i]-=t;
flag=false;
for(register int i=++l;i>0;i--) if(b[i]>1) {b[i+1]++;b[i]-=2;if(i>1) b[i-2]++;flag=true;}
}
while(b[l]==0) l--;
printf("%d ",l);b[1]+=b[0];
for(register int i=1;i<=l;i++) printf("%d ",b[i]);
}