思路:分别计算出两段的元素值,将在第一段出现的元素打上标记,第二段如果得到打上标记的点,那么它后面的元素也会在第一段中出现,可以由此计算出答案
#include <iostream>
#include <unordered_map>
using namespace std;
#define int long long
#define endl'\n'
int a, b, c, x, mod, n, m;
unordered_map<int, int> pos;
void slove() {
cin>>n>>m>>mod>>x>>a>>b>>c;
pos.clear();
for(int i=1;i<=n;i++){
x=((x*x)%mod*a%mod+b*x%mod+c)%mod;
if(!pos[x])pos[x]=i;
}
int ans=0,res=0;
for(int i=1;i<=m;i++){
x=((x*x)%mod*a%mod+b*x%mod+c)%mod;
if(pos[x]){
ans=min(n-pos[x]+1,m-i+1);
}
res=max(res,ans);
}
cout<<res<<endl;
}
signed main() {
int t; cin >> t;
while (t--) {
slove();
}
}