公式推导题,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; }