• [JZOJ3461] 小麦亩产一千八


    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.

    Summary

      由于第0位放了一粒小麦,第1位放了p粒小麦,那么后面依次是p+1,2p+1,3p+2,5p+3,不难发现系数和常数都是菲波那切数列。
     1 #include<cstdio>
     2 using namespace std;
     3 long long a[30],n,m,p;
     4 int main()
     5 {
     6     a[1]=1;a[2]=1;
     7     for (int i=3;i<=30;i++)
     8         a[i]=a[i-1]+a[i-2];
     9     while (~scanf("%lld%lld%lld",&n,&m,&p))
    10         if ((m-a[n-1])%a[n]==0)
    11         {
    12             long long k=(m-a[n-1])/a[n];
    13             long long z=k*a[p]+a[p-1];
    14             printf("%lld
    ",z);
    15         }
    16         else
    17             printf("-1
    ");
    18 }
    View Code
     
  • 相关阅读:
    Splay复习
    带权并查集复习-HDU3038
    罗素悖论-图灵停机问题
    数独解法c++实现
    状压DP NOI2001 炮兵阵地
    区间第k大数
    分块随笔T2
    分块感想
    webkit的高级属性
    设计模式
  • 原文地址:https://www.cnblogs.com/Tokisaki-Kurumi/p/9336559.html
Copyright © 2020-2023  润新知