f(0)=1,f(1)=1,f(2)=2,f(3)=3……
f(0)+f(1)+f(2)+…+f(n)=f(n+2)−1
证明:f(n)=f(n+2)-f(n+1)
f(0)+f(2)+f(4)+f(6)+…+f(2n)=f(2n+1)
证明:f(n)=f(n+1)-f(n-1)
f(1)+f(3)+f(5)+…+f(2n−1)=f(2n)−1
证明:同上
f(0)2+f(1)2+…+f(n)2=f(n)⋅f(n+1)
证明:f(i)f(i)=f(i)[f(i+1)-f(i-1)]
f(n+m)=f(m−1)f(n+1)+f(m−2)f(n),∀m≥2
证明:归纳法
f(0)−f(1)+f(2)−…+(−1)n⋅f(n)=(−1)n⋅[f(n+1)−f(n)]+1
这里我们使用公式:
f(n+m)=f(m−1)f(n+1)+f(m−2)f(n),∀m≥2
当m=k+1,n=k:
f(2k+1)=f(k)f(k+1)+f(k−1)f(k)=f(k)f(k+1)+[f(k+1)−f(k)]f(k)=f(k)[f(k+1)+f(k+1)−f(k)]
当m=k+1,n=k-1:
f(2k)=f(k)f(k)+f(k−1)f(k−1)
代码里面的f函数这里用f1叙述
f(n)=f1(n+1)
#include <cstdio>
#include <map>
using namespace std;
map<int, int> m;
const int md = 19999997;
long long f(const int x) {
if(x <= 2) return x ? 1 : 0;
if(m.count(x))
return m[x];
const int k = x >> 1;
const long long a =f(k);
const long long b = f(k + 1);
if(x & 1)
return m[x]=(a *a + b * b) % md;
else
return m[x] = a * (b + b - a + md) % md;
}
int main() {
int n;
while(1){
scanf("%d", &n);
printf("%d\n", int(f(n + 1)));
}
return 0;
}