题目大意:
在第0格放1个小麦,第1格放个小麦,以后每一格放前两格小麦数量之和。给出第格放了个小麦,求第格有多少个小麦。
1 1 2
3 5 4
3 4 6
12 17801 19
2
8
-1
516847
思路:
可以先推一下。
| 格子数 | 小麦数 |
|---|---|
| 0 | |
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| 7 | |
| 8 |
很明显,若为斐波那契数列第项,那么第个格子有个小麦。
我们已经知道第个格子有个小麦,那么就可以根据上面的公式求出,再根据上面的公式,即可求出小麦的数量。
代码:
#include <cstdio>
#include <iostream>
using namespace std;
long long a,x,b,p,f[31];
int main()
{
f[1]=1;
for (int i=2;i<=28;i++)
f[i]=f[i-1]+f[i-2]; //求斐波那契数列
while (scanf("%lld%lld%lld",&a,&x,&b)==3) //多组数据
{
if ((x-f[a-1])%f[a]) //如果第a个格子不能放整数个小麦
{
printf("-1\n");
continue;
}
p=(x-f[a-1])/f[a]; //计算p
printf("%lld\n",f[b]*p+f[b-1]);
}
return 0;
}