题目大意:
在第0格放1个小麦,第1格放pp个小麦,以后每一格放前两格小麦数量之和。给出第aa格放了xx个小麦,求第bb格有多少个小麦。
InputInput
1 1 2
3 5 4
3 4 6
12 17801 19
OutputOutput
2
8
-1
516847
思路:
可以先推一下。
格子数 | 小麦数 |
---|---|
0 | 11 |
1 | pp |
2 | p+1p+1 |
3 | 2p+12p+1 |
4 | 3p+23p+2 |
5 | 5p+35p+3 |
6 | 8p+58p+5 |
7 | 13p+813p+8 |
8 | 21p+1321p+13 |
很明显,若f[i]f[i]为斐波那契数列第ii项,那么第ii个格子有f[i]×p+f[i−1]f[i]×p+f[i−1]个小麦。
我们已经知道第aa个格子有ii个小麦,那么就可以根据上面的公式求出pp,再根据上面的公式,即可求出小麦的数量。
代码:
#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;
}