## 前言
这场比赛难度炸天啊!!!没见过这号的!
这已经是本场比赛最简单的题了,但还是有必要讲讲~~因为只会这题~~
可见,即使是签到题,错误率也是杠杠的。
## 题目
由特殊的生成机制$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 了
我被这弄了很久。。。
这场比赛难度炸天啊!!!没见过这号的!
这已经是本场比赛最简单的题了,但还是有必要讲讲~~因为只会这题~~
可见,即使是签到题,错误率也是杠杠的。
## 题目
由特殊的生成机制$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 了
我被这弄了很久。。。

京公网安备 11010502036488号