L. 普通递归关系

在这里插入图片描述
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(n1)+f(n2)
构造出这样的 k + s = 1 。 − s k = 1 k+s=1。-sk=1 k+s=1sk=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)kf(n1)=s(f(n1)kf(n2))
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(n1)kf(n2)=s(f(n2)kf(n3))

f ( 3 ) − k ∗ f ( 2 ) = s ∗ ( f ( 2 ) − k ∗ f ( 1 ) ) f(3)-k*f(2)=s*(f(2)-k*f(1)) f(3)kf(2)=s(f(2)kf(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)kf(n1)=sn2(f(2)kf(1))
因为 s = 1 − k ; f ( 2 ) = f ( 1 ) = 1 s=1-k;f(2)=f(1)=1 s=1k;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)=sn1+kf(n1)
f ( n ) = s n − 1 + k ∗ f ( n − 1 ) f(n)=s^{n-1}+k*f(n-1) f(n)=sn1+kf(n1)
= s n − 1 + k ∗ s n − 2 + k 2 ∗ f ( n − 2 ) =s^{n-1}+k*s^{n-2}+k^2*f(n-2) =sn1+ksn2+k2f(n2)
. . . . . . ...... ......
= 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) =sn1+ksn2+k2sn3+....+kn1f(1)
利用等比数列求和,首项为 s n − 1 s^{n-1} sn1,公比为 k / s k/s k/s;
f ( n ) = ( s n − k n ) / ( s − r ) f(n)=(s^n-k^n)/(s-r) f(n)=(snkn)/(sr)
根据是 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=(1sqrt(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((1sqrt(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)=sksn(f1kf0)kn(f1sf0)
其中 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)=sksn(f1kf0)kn(f1sf0)谁在前,分子分母都要在前。

#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;
}

猜你喜欢

转载自blog.csdn.net/weixin_45911397/article/details/114377806