题目大意:
在第0格放1个小麦,第1格放
p
p
个小麦,以后每一格放前两格小麦数量之和。给出第格放了
x
x
个小麦,求第格有多少个小麦。
Input
I
n
p
u
t
1 1 2
3 5 4
3 4 6
12 17801 19
Output O u t p u t
2
8
-1
516847
思路:
可以先推一下。
格子数 | 小麦数 |
---|---|
0 | 1 1 |
1 | |
2 | p+1 p + 1 |
3 | 2p+1 2 p + 1 |
4 | 3p+2 3 p + 2 |
5 | 5p+3 5 p + 3 |
6 | 8p+5 8 p + 5 |
7 | 13p+8 13 p + 8 |
8 | 21p+13 21 p + 13 |
很明显,若
f[i]
f
[
i
]
为斐波那契数列第
i
i
项,那么第个格子有
f[i]×p+f[i−1]
f
[
i
]
×
p
+
f
[
i
−
1
]
个小麦。
我们已经知道第
a
a
个格子有个小麦,那么就可以根据上面的公式求出
p
p
<script type="math/tex" id="MathJax-Element-1201">p</script>,再根据上面的公式,即可求出小麦的数量。
代码:
#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;
}