题目: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 之间不存在比例关系