Output
一个数F(n)
Samples
Input Copy
0 1 1 1 20
Output
6765
题意: 给出你一个递归关系,给出你第一项,第二项,和a,b,n.让你求F(n)的大小。
题解: 首先我们拿到这个题,就可以看出他想斐波那契数列,类比于f0=0,f1=1,a=1,b=1,这就是一个斐波那契数列,我们能够推出他的通项:
f
(
n
)
=
f
(
n
−
1
)
+
f
(
n
−
2
)
f(n)=f(n-1)+f(n-2)
f(n)=f(n−1)+f(n−2)
构造出这样的
k
+
s
=
1
。
−
s
k
=
1
k+s=1。-sk=1
k+s=1。−sk=1
f
(
n
)
−
k
∗
f
(
n
−
1
)
=
s
∗
(
f
(
n
−
1
)
−
k
∗
f
(
n
−
2
)
)
f(n)-k*f(n-1)=s*(f(n-1)-k*f(n-2))
f(n)−k∗f(n−1)=s∗(f(n−1)−k∗f(n−2))
f
(
n
−
1
)
−
k
∗
f
(
n
−
2
)
=
s
∗
(
f
(
n
−
2
)
−
k
∗
f
(
n
−
3
)
)
f(n-1)-k*f(n-2)=s*(f(n-2)-k*f(n-3))
f(n−1)−k∗f(n−2)=s∗(f(n−2)−k∗f(n−3))
…
f
(
3
)
−
k
∗
f
(
2
)
=
s
∗
(
f
(
2
)
−
k
∗
f
(
1
)
)
f(3)-k*f(2)=s*(f(2)-k*f(1))
f(3)−k∗f(2)=s∗(f(2)−k∗f(1))
联立得:
f
(
n
)
−
k
∗
f
(
n
−
1
)
=
s
n
−
2
∗
(
f
(
2
)
−
k
∗
f
(
1
)
)
f(n)-k*f(n-1)=s^{n-2}*(f(2)-k*f(1))
f(n)−k∗f(n−1)=sn−2∗(f(2)−k∗f(1))
因为
s
=
1
−
k
;
f
(
2
)
=
f
(
1
)
=
1
s=1-k;f(2)=f(1)=1
s=1−k;f(2)=f(1)=1
所以化简一下就是
f
(
n
)
=
s
n
−
1
+
k
∗
f
(
n
−
1
)
f(n)=s^{n-1}+k*f(n-1)
f(n)=sn−1+k∗f(n−1)
f
(
n
)
=
s
n
−
1
+
k
∗
f
(
n
−
1
)
f(n)=s^{n-1}+k*f(n-1)
f(n)=sn−1+k∗f(n−1)
=
s
n
−
1
+
k
∗
s
n
−
2
+
k
2
∗
f
(
n
−
2
)
=s^{n-1}+k*s^{n-2}+k^2*f(n-2)
=sn−1+k∗sn−2+k2∗f(n−2)
.
.
.
.
.
.
......
......
=
s
n
−
1
+
k
∗
s
n
−
2
+
k
2
∗
s
n
−
3
+
.
.
.
.
+
k
n
−
1
∗
f
(
1
)
=s^{n-1}+k*s^{n-2}+k^2*s^{n-3}+....+k^{n-1}*f(1)
=sn−1+k∗sn−2+k2∗sn−3+....+kn−1∗f(1)
利用等比数列求和,首项为
s
n
−
1
s^{n-1}
sn−1,公比为
k
/
s
k/s
k/s;
f
(
n
)
=
(
s
n
−
k
n
)
/
(
s
−
r
)
f(n)=(s^n-k^n)/(s-r)
f(n)=(sn−kn)/(s−r)
根据是 s+k=1,-sk=1得:
s
=
(
1
+
s
q
r
t
(
5
)
)
/
2
s=(1+sqrt(5))/2
s=(1+sqrt(5))/2
k
=
(
1
−
s
q
r
t
(
5
)
)
/
2
k=(1-sqrt(5))/2
k=(1−sqrt(5))/2
即:
f
(
n
)
=
s
q
r
t
(
5
)
/
5
∗
[
(
(
1
+
s
q
r
t
(
5
)
)
/
2
)
n
−
(
(
1
−
s
q
r
t
(
5
)
)
/
2
)
n
]
f(n)=sqrt(5)/5*[((1+sqrt(5))/2)^n-((1-sqrt(5))/2)^n]
f(n)=sqrt(5)/5∗[((1+sqrt(5))/2)n−((1−sqrt(5))/2)n]
而这个题就是类比斐波那契数列的通项来算的,只不过f0和f1不是0和1,a和b也不是1和1.而我们只需要把上面对应的位置换了就行。
我们推出
F
(
n
)
=
s
n
(
f
1
−
k
∗
f
0
)
−
k
n
(
f
1
−
s
∗
f
0
)
s
−
k
F\left( n\right)=\frac{s^{n}(f_{1}-k*f_{0})-k^{n}(f_{1}-s*f_{0})}{s-k}
F(n)=s−ksn(f1−k∗f0)−kn(f1−s∗f0)
其中
s
,
k
=
a
±
a
2
+
4
b
2
s,k=\frac{a\pm\sqrt{a^{2}+4b}}{2}
s,k=2a±a2+4b
注意s,k的对应关系,
F
(
n
)
=
s
n
(
f
1
−
k
∗
f
0
)
−
k
n
(
f
1
−
s
∗
f
0
)
s
−
k
F\left( n\right)=\frac{s^{n}(f_{1}-k*f_{0})-k^{n}(f_{1}-s*f_{0})}{s-k}
F(n)=s−ksn(f1−k∗f0)−kn(f1−s∗f0)谁在前,分子分母都要在前。
#include <map>
#include <queue>
#include <string>
#include<iostream>
#include<stdio.h>
#include<string.h>
#include <algorithm>
#include <math.h>
typedef long long ll;
using namespace std;
typedef pair<ll,ll> pii;
#define mem(a,x) memset(a,x,sizeof(a))
#define debug(x) cout << #x << ": " << x << endl;
#define rep(i,n) for(int i=0;i<(n);++i)
#define repi(i,a,b) for(int i=int(a);i<=(b);++i)
#define repr(i,b,a) for(int i=int(b);i>=(a);--i)
const int maxn=2e5+1010;
#define inf 0x3f3f3f3f
#define sf scanf
#define pf printf
const int mod=1e9+7;
const int MOD=10007;
double qpow(double a,ll b) {
double ans=1;
while(b) {
if(b&1) ans=ans*a;
b>>=1;
a=a*a;
}
return ans;
}
int main() {
double f0,f1,a,b;
ll n;
cin>>f0>>f1>>a>>b>>n;
if(f0==0&&f1==0) printf("0\n");
else {
double s=(a+sqrt(4*b+a*a))/2;
double r=(a-sqrt(4*b+a*a))/2;
printf("%.0lf\n",(qpow(s,n)*(f1-f0*r)-qpow(r,n)*(f1-s*f0))/(s-r));
}
return 0;
}