题目来自于浙江大学第13届校赛
zoj3702:
题意:给定一个数列G,G[0] = 1; G[1] 是一个随机数,然后从G[2] 开始 G[I] = G[I-1] + G[I-2] ( I>= 2)
然后给定一个I ,G[I],J 求G[J] 的值
解题思路:这个数列中的每一个值都可以用G[I] = XG[0] + YG[1];
表示,而X,Y这两个系数发现可知又正好是一个斐波那契数列,所以可以求出G[1]是多少 然后求得 G[J] 的值
解题代码:
View Code
#include <stdio.h> #include <string.h> #include <stdlib.h> long long int a[30]; long long int b[30]; long long int g[30]; int main() { int t ; a[0] = 0; a[1] = 1; b[0] = 0; b[1] = 0; b[2] = 1; for(int i = 2;i <= 20;i ++) { a[i] = a[i-1]+a[i-2]; } for(int i = 3 ;i <= 20 ;i ++) { b[i] = b[i-1] +b[i-2]; } scanf("%d",&t); while(t--) { long long int i,j,k; memset(g,0,sizeof(g)); scanf("%lld %lld %lld",&j,&k,&i); g[0] = 1; if((k-b[j] != 0) && (k-b[j]) % a[j] ==0) g[1] = (k-b[j])/a[j]; else { printf("-1\n"); continue; } for(int i = 2;i <= 20 ;i ++) { g[i] = g[i-1]+g[i-2]; } /*for(int i = 1;i <= 20 ;i ++) printf("%d ",g[i]); printf("\n");*/ printf("%lld\n",g[i]); } return 0; }