ZOJ 3702 Gibonacci number (找规律/不看题解好了)

题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=38341

代码:

#include<stdio.h>
#include<string.h>
#include<math.h>

using namespace std;

long long int fa[21];

int init()
{
    fa[0]=1;
    fa[1]=1;
    for(int i=2; i<=20; i++)
    {
        fa[i]=fa[i-1]+fa[i-2];
    }

}

int main()
{
    //freopen("B.in.txt","r",stdin);
    //freopen("B.out.txt","w",stdout);
    init();
    int t;
    scanf("%d",&t);
    while(t--)
    {
        long long a,b,c;
        scanf("%lld%lld%lld",&a,&b,&c);

        if((b-fa[a])%(fa[a-1])!=0||b<fa[a])
            printf("-1\n");
        else
            printf("%lld\n",fa[c]+fa[c-1]*((b-fa[a])/fa[a-1]));
    }
}



改了好厂时间。疯了。

分析:


输入  a,b,c


n          0 1 2 3   4   5                                                                     

fa【i】1 1 2 3   5   8 

            1 2 3 5   8                      可能存在的G【i】                            与fa【i】之间存在固定差             固定差fa【j-1】*1                1=(b-fa【i】)/fa【i-1】   (8-5)/3

            1 3 4 7   11                    可能存在的G【i】                            与fa【i】之间存在固定差            固定差fa【j-1】*2                                                                    (11-5)/3

            1 4 5 9   14

            1 5 6 11 17

            1 6 7 13 20 

            1 7 8 15 23


G【j】=fa【j】+固定差

还有 b 有最小值为 斐波那契数列 的 fa【i】


所以输出-1时

一定满足输入的b小于fa【i】a 与 b 之间不存在比例关系

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值