#斐波那契#洛谷 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; 
}
原文地址:https://www.cnblogs.com/Spare-No-Effort/p/13763295.html