本文主要是介绍小麦亩产一千八【数论】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目大意:
在第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]; //计算pprintf("%lld\n",f[b]*p+f[b-1]);}return 0;
}
这篇关于小麦亩产一千八【数论】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!