Jzoj3769【NOI2015模拟8.14】A+B
完成斐波那契进制下的加法运算
第一位为1,第二位为2,依次类推。。
这里其实很简单,只是要考虑一下进位即可
首先连续两位不为零直接向前进位即可
但是不能解决问题,因为可能出现一个位上面的值大于1
那么我们可以这样做,设连续的四位分别为:0,0,2,0
那么我们可以将其变成1,0,0,1
这样就相当于一次进位了,多次重复以上的进位过程即可
这里可以加上第0位方便运算
#include<stdio.h> #include<algorithm> using namespace std; int n,m,a[2000020],b[2000020],t,M; int main(){ scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",a+i); scanf("%d",&m); for(int i=1;i<=m;++i) scanf("%d",b+i); t=M=max(n,m)+30; if(a[1]) b[!b[1]]=1; a[1]=0; for(int i=1;i<=t;++i) b[i]+=a[i]; for(int C=1;(1<<C)<=M;++C){ for(int i=1;i<=t;++i){ if(b[i]&&b[i-1]){ int t=min(b[i],b[i-1]); b[i+1]+=t; b[i]-=t; b[i-1]-=t; } } for(int i=++t;i>0;--i){ if(b[i]>1){ b[i+1]++; b[i]-=2; if(i>1) b[i-2]++; } } } while(b[t]==0) t--; printf("%d ",t); b[1]+=b[0]; for(int i=1;i<=t;++i) printf("%d ",b[i]); }