#斐波那契#洛谷 3424 [POI2005] SUM-Fibonacci Sums

题目

已知\(x,y\)的斐波那契表示,求\(x+y\)的斐波那契表示


分析

显然得到两条性质:

  1. \(f_{i+1}=f_{i-1}+f_i\)
  2. \(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; 
}
posted @ 2020-10-03 01:53  lemondinosaur  阅读(55)  评论(0编辑  收藏  举报