#538. 「LibreOJ NOIP Round #1」数列递推

题目描述

https://loj.ac/problem/538

题解

可以感受到增长速度很快,并且很快会同符号

所以推个几百项之后即可直接判断,要注意特殊情况0和边界

code

#include <bits/stdc++.h>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define abs(x) ((x)>0?(x):-(x))
#define ll long long
#define N 10000000
#define file
using namespace std;

int s[100001],n,Q,i,j,k,l,ans1,ans2;
ll a[100001],K,Ans1,Ans2;

int main()
{
	freopen("seq.in","r",stdin);
	#ifdef file
	freopen("seq.out","w",stdout);
	#endif
	
	scanf("%d",&n);
	fo(i,1,n) scanf("%d",&s[i]);
	scanf("%d",&Q);
	for (;Q;--Q)
	{
		scanf("%lld%lld%lld",&a[0],&a[1],&K);
		i=1;
		while ((a[i-1] || a[i]) && !(abs(a[i-1])>N && abs(a[i])>N && !((a[i-1]<0)^(a[i]<0))))
		++i,a[i]=a[i-1]*K+a[i-2];
		
		Ans1=-9223372036854775807ll,Ans2=9223372036854775807ll;
		l=1;
		fo(j,0,i)
		if (j==s[l])
		{
			if (a[j]>Ans1) Ans1=a[j],ans1=j;
			if (a[j]<Ans2) Ans2=a[j],ans2=j;
			++l;
		}
		
		if (a[i]>0)
		{if (s[n]>=i) ans1=s[n];if (Ans2>N) ans2=s[1];}
		else
		if (a[i]<0)
		{if (s[n]>=i) ans2=s[n];if (Ans1<-N) ans1=s[1];}
		else
		ans1=ans2=s[1];
		printf("%d %d\n",ans1,ans2);
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}
posted @ 2020-10-08 07:47  gmh77  阅读(167)  评论(0编辑  收藏  举报