题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3702
题目大意:
给一个数列,第一项是1,给第 i 项,这个数列满足斐波那契数列的那种性质。问是不是存在,如果存在输出第 j 项,否则输出 -1
题目思路:
找规律,这个数列每一项和原来的斐波那契数列的差值是原来的斐波那契数列的倍数。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 using namespace std; 5 #define LL long long int 6 LL f[30], g[30]; 7 8 int main(void){ 9 int i , j , k; 10 f[0] = f[1] = 1; 11 for (i = 2; i < 23; ++i) { 12 f[i] = f[i-2] + f[i-1]; 13 } 14 LL I, J, GI; 15 int t; 16 scanf("%d", &t); 17 while (t--) { 18 cin >> I >> GI >> J; 19 LL d = GI - f[I]; 20 if (d < 0 || d % f[I-1] != 0) { 21 printf("-1\n"); continue; 22 } 23 d = d / f[I-1]; 24 cout << f[J-1] * d + f[J] << endl; 25 } 26 return 0; 27 }
虽然以前做过这道题,但是忘了什么规律了,想很久……