题目大意:
在第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;
}