ZOJ 3702 Gibonacci number(数学推导)

  公式推导题,G(0) = 1,G(1) = t,给出一个 i 和 G(i),要求求出G(j)的值;

  G(0) = 0*t + 1
  G(1) = 1*t + 0; 观察t的系数和常数值可以知道二者都遵循斐波那契的规律,设系数值为Y(n),常数值为X(n);
  G(2) = 1*t + 1; Y(0) = 0,Y(1) = 1;
  G(3) = 2*t + 1; X(0) = 1, X(1) = 0;
  G(4) = 3*t + 2; 这样就能求出答案了,最后的t满足要求就有解
  G(5) = 5*t + 3;

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
long long x[10000],y[10000];
void init()
{
    x[0]=1,x[1]=0;
    y[0]=0,y[1]=1;
    for(int i=2; i<=80; i++)
    {
        x[i]=x[i-1]+x[i-2];
        y[i]=y[i-1]+y[i-2];
    }
}
int main()
{
    int T;
    init();
    scanf("%d",&T);
    int i,gi,j;
    while(T--)
    {
        scanf("%d%d%d",&i,&gi,&j);
        long long t;
        t=(gi-x[i])/y[i];
        if((gi-x[i])%y[i]!=0||t<1)
            printf("-1
");
        else
            printf("%lld
",x[j]+t*y[j]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/jifahu/p/5490774.html