JZOJ6月20日提高组T1 小麦亩产一千八

JZOJ6月20日提高组T1 小麦亩产一千八

题目

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.

分析

一看就知道是 F i b o n a c c i Fibonacci Fibonacci数列
不妨设 f [ 1 ] = p f[1]=p f[1]=p
那就有

if[i]
01
1p
21+p
31+2p
42+3p
53+5p
…………

不妨可以发现
f [ i ] f[i] f[i]
a + b p a+bp a+bp中的 a a a是一个斐波那契数列
b b b也是一个斐波那契数列
同时
当斐波那契数列中的第 i i i项为 a a a
i + 1 i+1 i+1项正好是 b b b
所以说
我们就把读进来的 x x x尝试分解
看能不能分解成 a + b p a+bp a+bp的形式
( x − a ) (x-a) (xa)无法整除 b b b时,就是不存在的情况,就输出-1
否则就可以把 p p p求出来
然后再带到要求的位置上的 a + b p a+bp a+bp
PS:注意注意要用longlong (不要问为什么,问就是没了50分)

Code

#include<cstdio>
#include<cstring>
using namespace std;
int n,m,i;
long long s,y,x;
long long num[25],f[25];
int main()
{
	num[2]=1;
	for (i=3;i<=21;i++)
		num[i]=num[i-1]+num[i-2];
	while ((scanf("%d%lld%d",&n,&x,&m))!=EOF)
	{
		memset(f,0,sizeof(f));
		f[0]=1;
		if (n==1||n==2) 
		{
			f[1]=x-n+1;
			for (i=2;i<=m;i++)
				f[i]=f[i-1]+f[i-2];
			printf("%lld\n",f[m]);
		}
		else
		{
			s=x-num[n];
			y=s/num[n+1];
			if ((long long)y*num[n+1]!=s)
			{
				printf("-1\n");
				continue;
			}
			else printf("%lld\n",num[m]+num[m+1]*y);
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值