吉波那切数列——宇

gibonacci

题目:这题这恶心了

我比较作死,取模的时候搞了个****

代码是这样的

#include<bits/stdc++.h>
using namespace std;
long long g1[100010],g2[100010],mo=19960515;

int why()
{
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}

int main()
{
	freopen("gibonacci.in","r",stdin);
	freopen("gibonacci.out","w",stdout);
	g1[0]=g2[1]=1;
	g1[1]=g2[0]=0;
	int t,k=2;
	scanf("%d",&t);
	for(;t;t--)
	{
		int i,Gi,j;
		scanf("%d%d%d",&i,&Gi,&j);
		if(j<0){printf("-1");continue;}
		for(;k<=max(i,j);k++)
		g1[k]=((g1[k-1]+g1[k-2])>mo?(g1[k-1]+g1[k-2]-mo):(g1[k-1]+g1[k-2])),
		g2[k]=((g2[k-1]+g2[k-2])>mo?(g2[k-1]+g2[k-2]-mo):(g2[k-1]+g2[k-2]));
		long long x=(Gi-g1[i])/g2[i];
		printf("%lld\n",((g1[j]+x*g2[j]>mo)?(g1[j]+x*g2[j]-mo):(g1[j]+x*g2[j])));
	}
	return why();
}

把取模的代码用“%”换上之后得到了80分

#include<bits/stdc++.h>
using namespace std;
long long g1[100010],g2[100010],mo=19960515;

int why()
{
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}

int main()
{
	freopen("gibonacci.in","r",stdin);
	freopen("gibonacci.out","w",stdout);
	g1[0]=g2[1]=1;
	g1[1]=g2[0]=0;
	int t,k=2;
	scanf("%d",&t);
	for(;t;t--)
	{
		int i,Gi,j;
		scanf("%d%d%d",&i,&Gi,&j);
		if(j<0){printf("-1");continue;}
		for(;k<=max(i,j)+10;k++)
		g1[k]=(g1[k-1]+g1[k-2])%mo,g2[k]=(g2[k-1]+g2[k-2])%mo;
		long long x=(Gi-g1[i])/g2[i];
		printf("%lld\n",(g1[j]+x*g2[j])%mo);
	}
	return why();
}

在测试里找了找,发现“-1”么得了,这才想到好像真存在无解的情况······

最后改成这样才搞定(非常惊恐,可能要做俯卧撑)

#include<bits/stdc++.h>
using namespace std;
long long g1[100010],g2[100010],mo=19960515;

int why()
{
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}

int main()
{
	freopen("gibonacci.in","r",stdin);
	freopen("gibonacci.out","w",stdout);
	g1[0]=g2[1]=1;
	g1[1]=g2[0]=0;
	int t,k=2;
	scanf("%d",&t);
	for(;t;t--)
	{
		int i,Gi,j;
		scanf("%d%d%d",&i,&Gi,&j);
		if(j<0){printf("-1\n");continue;}
		for(;k<=max(i,j)+10;k++)
		g1[k]=(g1[k-1]+g1[k-2])%mo,g2[k]=(g2[k-1]+g2[k-2])%mo;
		if((Gi-g1[i])%g2[i]) {printf("-1\n");continue;}
		long long x=(Gi-g1[i])/g2[i];
		printf("%lld\n",(g1[j]+x*g2[j])%mo);
	}
	return why();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值