## 前言
这场比赛难度炸天啊!!!没见过这号的!
这已经是本场比赛最简单的题了,但还是有必要讲讲~~因为只会这题~~
可见,即使是签到题,错误率也是杠杠的。
## 题目
由特殊的生成机制$x=(ax^2+bx+c)mod p$生成序列s、t,求两者的最长公共子序列。~~真是简单极了~~
这题写起来简单,但debug就恶心心。


## 做法
因为两个序列生成方式相同,所以,只要有一个x相同,后面的都是一样的。所以只需查找相同的x就刑。
```cpp
#include<bits/stdc++.h> 
#define LL long long 
using namespace std; 
const int MXN=1e6+7; 
int n; 
struct Node{ 
    int id; 
    LL val; }
x[MXN]; 
bool cmp(Node tt,Node ss)

    if(tt.val==ss.val){ return tt.id<ss.id; } 
    return tt.val<ss.val; 

int lower(LL v)

    int l=1,mid,r=n; 
    while(l<=r){ 
        mid=(l+r)>>1; 
        if(v>x[mid].val)
        { l=mid+1; } 
        else { r=mid-1; } 
    } 
    return l; 

int main(){ 
    int m,t,ID; 
    LL p,a,b,c,y,ans=0; 
    scanf("%d",&t); 
    while(t--){ 
        ans=0; 
        scanf("%d%d%lld%lld%lld%lld%lld",&n,&m,&p,&y,&a,&b,&c); 
        for(int i=1;i<=n;i++){ 
            x[i].val=((((y*y)%p*a)%p+(y*b)%p)%p+c)%p; 
            x[i].id=i; 
            y=x[i].val; 
        } 
        sort(x+1,x+1+n,cmp); 
        for(int i=1;i<=m;i++){ 
            y=((((y*y)%p*a)%p+(y*b)%p)%p+c)%p; 
            ID=lower(y); 
            if(ID<=0||ID>n){ continue; } 
            if(x[ID].val==y){ 
                ans=max(ans,min((LL)m-i+1,(LL)n-x[ID].id+1)); 
            } 
        } 
        printf("%lld\n",ans); 
    } 
}
```
## tips
计算时一定要这么写!!--->     x=((((x*x)%p*a)%p+(x*b)%p)%p+c)%p;
因为x * x * a 超 long long 了
我被这弄了很久。。。