牛客多校第八场个人补题F
F
题意
给定x,a,b,c每次将 a ∗ x 2 + b ∗ x + c a*x^2+b*x+c a∗x2+b∗x+c作为下一个x,求n+m个,问前n个和后m个最长公共子序列是多少。
思路
我们可以发现只要有循环节就直接开始比较就行了(先以为只比第一个开始位置就一定最大,结果发现不停wa,改max过了。。。)
代码
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;
const int N = 1e6 + 10;
const int mod = 998244353;
typedef pair<int, int> PII;
unordered_map<int,int> pos;
void solve(){
pos.clear();
int n, m, p, x, a, b, c;
cin >> n >> m >> p >> x >> a >> b >> c;
for(int i = 1;i <= n;i++){
x = (a % p * x % p * x % p + b % p * x % p + c % p) % p;
if(!pos.count(x))pos[x] = i;
}
int ans = 0;
for(int i = 1;i <= m;i++){
x = (a % p * x % p * x % p + b % p * x % p + c % p) % p;
if(pos.count(x)){
ans =max(ans,min(m - i + 1, n - pos[x] + 1)) ;
}
}
cout << ans << "\n";
}
signed main() {
IOS;
int t = 1;
cin >> t;
for (int i = 1; i <= t; i++) {
solve();
}
}