#斐波那契#洛谷 3424 [POI2005] SUM-Fibonacci Sums
题目
已知\(x,y\)的斐波那契表示,求\(x+y\)的斐波那契表示
分析
显然得到两条性质:
- \(f_{i+1}=f_{i-1}+f_i\)
- \(2f_i=f_{i+1}+f_{i-2}\)
那么从最高位开始最多会影响到前两位的结果,那判定一下就好了,
时间复杂度\(O(len)\),实测\(O(len^2)\)会T,但我也不会证明上述方法正确性
代码
#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int N=1000011;
int len,len1,a[N];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void only(int now){
if (a[now]<=1) return; a[now]-=2;
if (now==1) ++a[2];
else if (now==2) ++a[1],++a[3];
else ++a[now-2],++a[now+1];
}
inline void both(int now){
for (;a[now]&&a[now+1];now+=2)
++a[now+2],--a[now],--a[now+1];
}
signed main(){
len1=iut(); for(rr int i=1;i<=len1;i++) a[i]=iut();
len=iut(); for (rr int i=1;i<=len;++i) a[i]+=iut();
len1=len>len1?len:len1;
for (rr int i=len1;i;--i)
only(i),both(i),
only(i+1),both(i+1),
only(i+2),both(i+2);
for (len=len1+10;!a[len];--len);
printf("%d",len);
for(rr int i=1;i<=len;++i) putchar(32),putchar(a[i]+48);
return 0;
}