Description
Solution
看它K<=150,明摆着就是让你求循环节,
于是把循环节搞出来(不一定从第一个位置开始),复制平方遍,再加上余下的,搞一遍普通的LIS即可,
复杂度:O(3∗1502log(1502))
Code
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define sqr(x) ((x)*(x))
using namespace std;
typedef long long LL;
const int N=260,INF=2147483640;
LL n,m,ans,n1,m1;
int a[N*N];
int bz[N];
int f[N*N*2];
int main()
{
freopen("lis.in","r",stdin);
freopen("lis.out","w",stdout);
int q,w,A,B,C,D;LL nn;
scanf("%lld%d%d%d%d%d",&n,&a[1],&A,&B,&C,&D);
nn=n;
bz[a[1]]=m=1;
while(!bz[a[1+m]=(sqr(a[m])*A+B*a[m]+C)%D])m++,bz[a[m]]=m;
q=bz[a[m+1]]-1;w=m-q;
m1=m;m+=w*(w-1)-q;
n-=q+m;n1=q+m+n%m;
fo(i,m1+1,n1)a[i]=a[i-w];
fo(i,1,n1)f[i]=INF;
n1=min(n1,nn);
LL add=((n/m>0?n/m:0))*w;int Q=q;
fo(i,1,n1)
{
q=upper_bound(f,f+n1+1,a[i])-f;
f[q]=min(f[q],a[i]);
ans=max(ans,q+(i>Q?add:0));
}
printf("%lld\n", ans);
return 0;
}