题目来自于浙江大学第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;
}

 

posted on 2013-05-08 22:13  dark_dream  阅读(179)  评论(0编辑  收藏  举报