思路
由于T较大,一直重复变换过程,直接模拟会超时,由于一直变换过程会出现重复的过程,所以只需找出重复的过程,然后进行计算即可。
代码
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int N=1e6+10;
LL n,p,k,b,t,x,a[N],vis[N],sum[N];
int main(){
cin>>n>>p>>k>>b>>t;
for(int i=0;i<n;i++)cin>>a[i];
for(LL i=1;i<=t;i++){
x+=a[p];
if(vis[p]){
LL len=i-vis[p];
LL d=x-sum[p];
LL tmp=(t-i)/len;
LL r=(t-i)%len;
x+=d*tmp;
for(LL j=1;j<=r;j++)p=(k*p+b)%n,x+=a[p];
break;
}
sum[p]=x;
vis[p]=i;
p=(p*k+b)%n;
}
cout<<x<<endl;
return 0;
}