题目链接:http://codeforces.com/contest/318/problem/D
思考一定要到位,心中要有特殊情况,以及处理方法,我是看错误样例改了一遍才过的,少考虑了-100000000000000 1 111111000000000000 这种情况
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iomanip>
using namespace std;
long long f[99999];
long long a[99999];
long long b[99999];
void ff()
{
f[0]=1;
f[1]=1;
for(int i=2;i<9999;i++)
{
f[i]=f[i-1]+f[i-2];
}
}
int main()
{
long long x,y,m;
int i;
ff();
while(cin>>x>>y>>m)
{
int ans=0;
if(x<=0&&y<=0&&m>max(x,y))
cout<<"-1"<<endl;
else if(x>=m||y>=m)
cout<<"0"<<endl;
else
{
long long cot=0;
if(min(x,y)<0&&max(x,y)>0)//针对类似-100000000 1 1000000
//的情况做预处理,使x/y都变为正数
{
if(x<y)
swap(x,y);
cot+=((-y)/x);
x=x;
y=y+cot*x;
}
f[0]=max(x,y);
a[0]=x;
b[0]=y;
for(i=1;i<9999;i++) //观察可发现两个整数的话,很快就能达到m
{
a[i]=f[i-1];
b[i]=a[i-1]+b[i-1];
f[i]=max(a[i],b[i]);
if(f[i]>=m)
break;
}
cout<<i+cot<<endl;
}
}
return 0;
}