Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define FILE "good"
- #define USE_FREOPEN 0
- #define USE_LONG 0
- #define USE_IOSOPT 1
- #if USE_LONG
- typedef long long ll;
- typedef unsigned long long ull;
- #else
- typedef int ll;
- typedef unsigned int ull;
- #endif
- typedef unsigned int ill;
- #define pb push_back
- #define mp make_pair
- #define fi first
- #define se second
- #define rm erase
- #define ins insert
- #define elsif else if
- #define skip(a) if((a)) continue;
- #define skipn(a) unless((a)) continue;
- #define unless(a) if(!(a))
- #define p(a, b) pair < a, b >
- #define sq(x) ((x) * (x))
- #define rev(a) reverse(a.begin(), a.end())
- #define ord(a) sort(a.begin(), a.end())
- #define rs resize
- #define sz size
- #define readv(a, n, tp) \
- for(int i = 0; i < n; i++) \
- { \
- tp d; \
- cin >> d; \
- a.pb(d); \
- }
- #define printv(a) \
- for(auto lsti = a.begin(); lsti != a.end(); lsti++) \
- { \
- cout << *lsti << ' '; \
- }
- #define die(a) \
- { \
- cout << a << endl; \
- exit(0); \
- }
- using namespace std;
- const ill MAXN = (ll)5e4;
- struct node {
- ll gcdx;
- node() {
- gcdx = 0;
- }
- } t[MAXN * 4];
- ll data[MAXN];
- void build(ill node, ill l, ill r)
- {
- if(l == r)
- {
- t[node].gcdx = data[l];
- return;
- }
- ill mid = (l + r) / 2;
- build(node * 2, l, mid);
- build(node * 2 + 1, mid + 1, r);
- t[node].gcdx = __gcd(
- t[node * 2].gcdx,
- t[node * 2 + 1].gcdx);
- }
- void print(ill node, ill l, ill r, ill lvl = 0)
- {
- for(int i = 0; i < lvl; i++)
- cout << " ";
- cout << node << "(" << l << ", " << r << ").gcdx = " << t[node].gcdx;
- if(l == r)
- {
- cout << "; data[" << l << "] = " << data[l];
- cout << endl;
- return;
- }
- cout << endl;
- ill mid = (l + r) / 2;
- print(node * 2, l, mid, lvl + 1);
- print(node * 2 + 1, mid + 1, r, lvl + 1);
- }
- ll get(ill node, ill l, ill r, ill tl, ill tr)
- {
- // cout << node << "(" << tl << ", " << tr << ").gcdx = " << t[node].gcdx << endl;
- if(tl > r || tr < l)
- return 0;
- if(tl >= l && tr <= r)
- return t[node].gcdx;
- ill mid = (tl + tr) / 2;
- return __gcd(
- get(node * 2, l, r, tl, mid),
- get(node * 2 + 1, l, r, mid + 1, tr));
- }
- ll get(ill l, ill r, ill n)
- {
- return get(1, l, r, 0, n - 1);
- }
- ll sqrtt(ll n)
- {
- ll sqn = sqrt(n);
- return (sq(sqn) == n ? sqn : -1);
- }
- int main()
- {
- #if USE_IOSOPT
- ios_base::sync_with_stdio(false);
- cin.tie(0);
- #endif
- #if USE_FREOPEN
- freopen(FILE".in", "r", stdin);
- freopen(FILE".out", "w", stdout);
- #endif
- ll tc;
- cin >> tc;
- while(tc--)
- {
- ll n;
- cin >> n;
- memset(data, 0, sizeof(data));
- for(int i = 0; i < n; i++)
- {
- cin >> data[i];
- }
- ll tn = n;
- n = 1;
- while(n < tn)
- n <<= 1;
- build(1, 0, n - 1);
- // print(1, 0, n - 1);
- ll l = 0, r = tn, ans = 0;
- while(l <= r)
- {
- ll m = (l + r) / 2;
- // cout << l << ' ' << r << ' ' << m << endl;
- ll tru = 0;
- for(int i = 0; i < (tn - m + 1); i++)
- {
- ll val = get(i, i + m - 1, n);
- // cout << "\t" << i << ' ' << (i + m - 1) << ' ' << val << endl;
- tru |= (val != 1);
- }
- if(tru)
- l = m + 1;
- else
- {
- r = m - 1;
- ans = m;
- }
- }
- cout << (ans > 1 ? ans : -1) << endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment