JZOJ 3461. 小麦亩产一千八(kela)

 题目

Description

“有了金坷垃,肥料一袋能顶两袋撒,小麦亩产一千八,吸收两米下的氮磷钾……”,话说HYSBZ(Hengyang School for Boys & Zy)学识渊博孩纸们一讲到粮食,都会想起印度那个著名的故事:国王要在第一个格子里放入一粒小麦,接下来的格子放入前面一个格子的两倍的小麦。这样所需小麦总数是巨大的,哪是不用金坷垃就能完成的任务?不过为了减轻国王的任务,那个下棋获胜的宰相换了一个要求:“我只需要你在棋盘外放一粒小麦,可以将其理解为第0 个格子,然后你需要在第一个格子里放入p粒小麦,之后每一个格子放入前两个格子的小麦数之和的小麦,并且要满足第a 个格子放x 粒小麦,第b 个格子放……”说到这,宰相突然发现自己说的满足第a 个格子放x 粒小麦的情况可能不存在……欺君可是大罪啊!国王看到宰相迟迟不说,自己也烦了!我自己来算!于是国王拜托你,让你算出第b 个格子应该放几粒小麦。当然,就算答案不存在,你也是要告诉国王的。
 

Input

该题有多组数据,请读到文件末结束。

对于每一组数据仅一行,3 个正整数a,x,b,分别表示第a 个格子放了x 粒小麦,以及你所需要计算的是第b 个格子的小麦数量。

Output

对于每一次询问,仅1 个整数,为第b 个格子的小麦数量,若宰相说的情况不存在,那么请输出-1。
 

Sample Input

1 1 2
3 5 4
3 4 6
12 17801 19

Sample Output

2
8
-1
516847
【样例解释】
对于样例二,f[1]=2 时,能够满足f[3]=5,因此宰相没有撒谎,此时第5 个格子的小麦数应为f[4]=f[2]+f[3]=3+5=8.
 
 

Data Constraint

对于50%的数据:如果答案存在,那么p<=50

对于100%的数据:1<=数据组数<=10000,1<=a,b<=20, 数据保证如果答案存在,那么1<=p<=1000000.

 

分析

 

  • 显然,斐波那契直接上
  • a b 20?? 暴力

 

代码

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm>
 6 #define ll long long
 7 const int N = 35;
 8 using namespace std;
 9 int c[23][2]={{0,0},{0,1},{1,1},{1,2},{2,3},{3,5},{5,8},{8,13},{13,21},{21,34},{34,55},{55,89},{89,144},{144,233},{233,377},{377,610},{610,987},{987,1597},{1597,2584},{2584,4181},{4181,6765},{6765,10946},{10946,17711}};
10 int main()
11 {
12      ll a,x,b;
13     while (scanf("%lld%lld%lld",&a,&x,&b)!=EOF)
14     {
15         if ((x-c[a][0])%c[a][1]==0)
16           printf("%lld\n",((x-c[a][0])/c[a][1])*c[b][1]+c[b][0]);
17         else cout<<-1<<endl;
18     }
19     return 0;
20 }

 

 

posted @ 2019-10-30 16:31  Melted_czj  阅读(236)  评论(0编辑  收藏  举报
body { background-color:whitesmoke; } // 修改背景颜色为半透明 #home,#sideBarMain>div,#blog-sidecolumn>div>div,.catListView{ background-color:rgba(255,255,255,0); } // 修改其他边框的颜色