一个思维题,切入点是n/2
写代码后交疯狂wa18,然后发现rand函数的上限是32767,太小了,换了一个随机数就过了。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 200020;
int n, mod;
std::mt19937 rnd(time(0));
int a[N];
ll qmi(ll a, int k) {
ll res = 1;
while(k) {
if(k & 1) res = (res * a) % mod;
a = (a * a) % mod;
k >>= 1;
}
return res;
}
int main() {
int t;
scanf("%d", &t);
while(t --) {
scanf("%d%d", &n,&mod);
for(int i = 1;i <= n;i ++) scanf("%d", &a[i]);
int ans = 0;
for(int Case = 1;Case <= 500;Case ++) {
ll x = rnd() % n + 1;
for(ll l = 1;l <=2 && l + x <= n;l ++) {
int num = 2;
ll q = (a[l+x] * qmi(a[x], mod-2)) % mod;
ll last = (a[l+x] * q) % mod;
for(int i = l + x + 1;i <= n;i ++) {
if(a[i] == last) {
num ++;
last = (last * q) % mod;
}
}
q = qmi(q, mod-2);
last = (a[x] * q) % mod;
for(int i = x-1;i >= 1;i --) {
if(a[i] == last) {
num ++;
last = (last * q) % mod;
}
}
ans = max(ans, num);
}
}
if(ans >= (n+1)/2) printf("%d\n", ans);
else printf("%d\n", -1);
}
return 0;
}