题目描述
题解
可以感受到增长速度很快,并且很快会同符号
所以推个几百项之后即可直接判断,要注意特殊情况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
",ans1,ans2);
}
fclose(stdin);
fclose(stdout);
return 0;
}