给定一个下标从\(0\)开始,无限长的整数列\({a_{i}}\),\(i \in N\) ,已知\(a_{0},a_{1}\) 的值,以及递推式\(a_{i+2}=ka_{i+1}+a_{i}\),\(i \in N\) ,\(k \in N^+\)。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}
const int N=3e5+10;
const int M=1e5+10;
int m,n,s[M],w[M];
ll a[N];
int main(){
// freopen("ex_seq4.in","r",stdin);
m=read();
for(int i=1;i<=m;++i){
s[i]=read();
}
n=read();
while(n--){
a[0]=read();a[1]=read();
int k=read();
int fi=min(100,s[m]);
ll mx=-1e16,mn=1e16;
int mxp=-1,mnp=-1;
for(int i=2;i<=fi;++i){
a[i]=1ll*k*a[i-1]+a[i-2];
if(a[i]>1e15&&a[i-1]>=0&&a[i-2]>=0&&a[i]>=0){fi=i;break;}
if(a[i]<-1e15&&a[i-1]<=0&&a[i-2]<=0&&a[i]<=0){fi=i;break;}
}
for(int i=1;i<=m;++i){
if(s[i]<fi){
if(a[s[i]]>mx) mx=a[s[i]],mxp=s[i];
if(a[s[i]]<mn) mn=a[s[i]],mnp=s[i];
}
else break;
}
if(a[fi]>mx&&a[fi]>0)mxp=s[m];
if(a[fi]<mn&&a[fi]<0)mnp=s[m];
if(mxp==-1)mxp=s[1];
if(mnp==-1)mnp=s[1];
printf("%d %d\n",mxp,mnp);
}
return 0;
手机扫一扫
移动阅读更方便
你可能感兴趣的文章