【???】【???】小麦亩产一百八
来源:互联网 发布:mumu模拟器 mac 卸载 编辑:程序博客网 时间:2024/04/27 15:23
【问题描述】
“有了金坷垃,肥料一袋能顶两袋撒,小麦亩产一千八,吸收两米下的氮磷钾……”,话说HYSBZ(Hengyang School for Boys & Zy)学识渊博孩纸们一讲到粮食,都会想起印度那个著名的故事:国王要在第一个格子里放入一粒小麦,接下来的格子放入前面一个格子的两倍的小麦。这样所需小麦总数是巨大的,哪是不用金坷垃就能完成的任务?不过为了减轻国王的任务,那个下棋获胜的宰相换了一个要求:“我只需要你在棋盘外放一粒小麦,可以将其理解为第0个格子,然后你需要在第一个格子里放入若干小麦,之后每一个格子放入前两个格子的小麦数之和的小麦,并且要满足第a个格子放x粒小麦,第b个格子放……”说到这,宰相突然发现自己说的满足第a个格子放x粒小麦的情况可能不存在……欺君可是大罪啊!国王看到宰相迟迟不说,自己也烦了!我自己来算!于是国王拜托你,让你算出第b个格子应该放几粒小麦。当然,就算答案不存在,你也是要告诉国王的。
【输入格式】kela.in
该题有多组数据,请读到文件末结束。
对于每一组数据仅一行,3个正整数a,x,b,分别表示第a个格子放了x粒小麦,以及你所需要计算的是第b个格子的小麦数量。
【输出格式】kela.out
对于每一次询问,仅1个整数,为第b个格子的小麦数量,若宰相说的情况不存在,那么请输出-1。
【样例输入】
1 1 2
3 5 4
3 4 6
12 17801 19
【样例输出】
2
8
-1
516847
【样例解释】
对于样例二,f[1]=2时,能够满足f[3]=5,因此宰相没有撒谎,此时第5个格子的小麦数应为f[4]=f[2]+f[3]=3+5=8.
【数据范围与约定】
对于50%的数据:如果答案存在,那么p<=50
对于100%的数据:1<=数据组数<=10000,1<=a,b<=20, 数据保证如果答案存在,那么1<=p<=1000000.(gwy注:p是第一格放置的小麦数)。
题解
题意:
给你一个数列,满足f(n)=f(n-1)+f(n-2);
知道第0项f(0)=1
给你第a项f(a),判断第a项可不可能为f(a);
如果可能就输出这个数列的第b项f(b);不可能就输出-1;
做法:
这数列只要第1项确定了。那么剩下的数就能确定了;
我们二分枚举第1项(题目有说在1-100W之间)
然后就需要通过第0项和第1项快速确定第a项是什么;
这可以用矩阵乘法实现
构造一个矩阵
利用矩阵乘法:
[0 1] * [f(n-2)] = [f(n-1)]
[1 1] [f(n-1)] [f(n) ]
从n-1转移到n需要乘1次;
那么从1转移到n就需要乘n-1次即
[0 1] ^(n-1) * [f(0)] = [f(n-1)]
[1 1] [f(1)] [f(n) ]
预处理出最左边那个矩阵的1..20次方;
通过二分的f(1)和已知的f(0)即可快速得到f(1..20),做出相应的判断即可;
如果最后二分结束了,还是不能得到一个f(1)使得f(a)=x,则输出-1;
否则再利用上面那个式子算出f(b)即可;
f(n)=构造矩阵的n-1次方[2][1]*f[0]+构造矩阵的n-1次方[2][2]*f[1];
这道题数据是我自己造的。
#include <cstdio>#define LL long longstruct abc{ LL jz[3][3];};abc a,pre[25];abc jc(abc a, abc b){ abc c; for (int i = 1; i <= 2; i++) for (int j = 1; j <= 2; j++) { c.jz[i][j] = 0; for (int k = 1; k <= 2; k++) c.jz[i][j] += a.jz[i][k] * b.jz[k][j]; } return c;}abc ksm(int x){ if (x == 1) return a; abc temp; temp = ksm(x>>1); temp = jc(temp, temp); if (x & 1) temp = jc(temp, a); return temp;}int main(){ //freopen("F:\\rush.txt", "r", stdin); a.jz[1][1] = 0; a.jz[1][2] = 1; a.jz[2][1] = 1; a.jz[2][2] = 1; for (int i = 1; i <= 20; i++)//可以不用快速幂 pre[i] = ksm(i); int number, key, what; while (~scanf("%d%d%d", &number, &key, &what)) { int l = 0, r = 1000000; LL f1=-1; if (number == 1)//如果给的是第一项的那么第一项就是key f1 = key; else while (l <= r)//二分枚举第1项 { int m = (l + r) >> 1; LL j = pre[number - 1].jz[2][1] + pre[number - 1].jz[2][2] * m; if (j == key) { f1 = m; break; } else if (j > key) r = m - 1; else l = m + 1; } if (f1 != -1)//如果找到了满足f(a)==x的f1,则输出f(b) { LL ans = what==1?f1:pre[what - 1].jz[2][1] + pre[what - 1].jz[2][2] * f1; printf("%I64d\n", ans); } else puts("-1"); } return 0;}
- 【???】【???】小麦亩产一百八
- 问题一百零八:元素的删除
- 袁隆平的亩产千斤?
- Android开发笔记(一百零八)智能语音
- SQL 77和小麦
- 小麦的学习笔记
- 最最爱的小麦
- 大麦与小麦
- 一百零八,十八指的是“十八界”,即六根、六尘、六识。
- 资治通鉴,卷一百零八,东晋孝武帝的荒唐结局之千万不要说女人老
- PyGobject(一百零八)CSS系列——混合模式
- 最最爱的小麦2
- Java程序员从笨鸟到菜鸟之(一百零八)一步一步学习webservice(二)webservice基本原理
- Java程序员从笨鸟到菜鸟之(一百零八)一步一步学习webservice(二)webservice基本原理
- Java程序员从笨鸟到菜鸟之(一百零八)一步一步学习webservice(二)webservice基本原理
- 袁隆平超级稻再创世界纪录 亩产突破一千公斤
- 使用Python对新农网爬取小麦种植技术文章
- 杨小麦iOS学习笔记--远程推送
- JAVA使用JDBC连接MySQL数据库
- HDU 5908 Abelian Period (暴力+map)
- 【NOIP2014模拟8.17】Magical GCD
- VIM 快捷方式
- 工作流管理系统开发之十八 工作流会签的相关实现
- 【???】【???】小麦亩产一百八
- 玩转CPU占用率曲线
- [NOIP2013]华容道
- 工作流管理系统开发之十九 工作流系统的事务处理
- 应激系统 排泄系统
- 在将 varchar 值 'system.web.ui.webcontrols.todayq 转换成数据类型 int 时失败。
- TCP/IP详解:协议(概述及链路层)
- [Java]快速排序,以及双基快排
- 工作流管理系统开发之二十 动态创建流程多分支节点