KarleFKremen

Untitled

Aug 12th, 2016
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.11 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define FILE "good"
  4. #define USE_FREOPEN 0
  5. #define USE_LONG 0
  6. #define USE_IOSOPT 1
  7.  
  8. #if USE_LONG
  9. typedef long long ll;
  10. typedef unsigned long long ull;
  11. #else
  12. typedef int ll;
  13. typedef unsigned int ull;
  14. #endif
  15. typedef unsigned int ill;
  16. #define pb push_back
  17. #define mp make_pair
  18. #define fi first
  19. #define se second
  20. #define rm erase
  21. #define ins insert
  22. #define elsif else if
  23. #define skip(a) if((a)) continue;
  24. #define skipn(a) unless((a)) continue;
  25. #define unless(a) if(!(a))
  26. #define p(a, b) pair < a, b >
  27. #define sq(x) ((x) * (x))
  28. #define rev(a) reverse(a.begin(), a.end())
  29. #define ord(a) sort(a.begin(), a.end())
  30. #define rs resize
  31. #define sz size
  32. #define readv(a, n, tp) \
  33.     for(int i = 0; i < n; i++) \
  34.     { \
  35.         tp d; \
  36.         cin >> d; \
  37.         a.pb(d); \
  38.     }
  39. #define printv(a) \
  40.     for(auto lsti = a.begin(); lsti != a.end(); lsti++) \
  41.     { \
  42.         cout << *lsti << ' '; \
  43.     }
  44. #define die(a) \
  45.     { \
  46.         cout << a << endl; \
  47.         exit(0); \
  48.     }
  49.  
  50. using namespace std;
  51.  
  52. const ill MAXN = (ll)5e4;
  53.  
  54. struct node {
  55.     ll gcdx;
  56.     node() {
  57.         gcdx = 0;
  58.     }
  59. } t[MAXN * 4];
  60. ll data[MAXN];
  61.  
  62. void build(ill node, ill l, ill r)
  63. {
  64.     if(l == r)
  65.     {
  66.         t[node].gcdx = data[l];
  67.         return;
  68.     }
  69.     ill mid = (l + r) / 2;
  70.     build(node * 2, l, mid);
  71.     build(node * 2 + 1, mid + 1, r);
  72.     t[node].gcdx = __gcd(
  73.             t[node * 2].gcdx,
  74.             t[node * 2 + 1].gcdx);
  75. }
  76.  
  77. void print(ill node, ill l, ill r, ill lvl = 0)
  78. {
  79.     for(int i = 0; i < lvl; i++)
  80.         cout << "  ";
  81.     cout << node << "(" << l << ", " << r << ").gcdx = " << t[node].gcdx;
  82.     if(l == r)
  83.     {
  84.         cout << "; data[" << l << "] = " << data[l];
  85.         cout << endl;
  86.         return;
  87.     }
  88.     cout << endl;
  89.     ill mid = (l + r) / 2;
  90.     print(node * 2, l, mid, lvl + 1);
  91.     print(node * 2 + 1, mid + 1, r, lvl + 1);
  92. }
  93.  
  94. ll get(ill node, ill l, ill r, ill tl, ill tr)
  95. {
  96. //  cout << node << "(" << tl << ", " << tr << ").gcdx = " << t[node].gcdx << endl;
  97.     if(tl > r || tr < l)
  98.         return 0;
  99.     if(tl >= l && tr <= r)
  100.         return t[node].gcdx;
  101.     ill mid = (tl + tr) / 2;
  102.     return __gcd(
  103.             get(node * 2, l, r, tl, mid),
  104.             get(node * 2 + 1, l, r, mid + 1, tr));
  105. }
  106.  
  107. ll get(ill l, ill r, ill n)
  108. {
  109.     return get(1, l, r, 0, n - 1);
  110. }
  111.  
  112. ll sqrtt(ll n)
  113. {
  114.     ll sqn = sqrt(n);
  115.     return (sq(sqn) == n ? sqn : -1);
  116. }
  117.  
  118. int main()
  119. {
  120. #if USE_IOSOPT
  121.     ios_base::sync_with_stdio(false);
  122.             cin.tie(0);
  123. #endif
  124. #if USE_FREOPEN
  125.     freopen(FILE".in", "r", stdin);
  126.     freopen(FILE".out", "w", stdout);
  127. #endif
  128.     ll tc;
  129.     cin >> tc;
  130.     while(tc--)
  131.     {
  132.         ll n;
  133.         cin >> n;
  134.         memset(data, 0, sizeof(data));
  135.         for(int i = 0; i < n; i++)
  136.         {
  137.             cin >> data[i];
  138.         }
  139.         ll tn = n;
  140.         n = 1;
  141.         while(n < tn)
  142.             n <<= 1;
  143.         build(1, 0, n - 1);
  144. //      print(1, 0, n - 1);
  145.         ll l = 0, r = tn, ans = 0;
  146.         while(l <= r)
  147.         {
  148.             ll m = (l + r) / 2;
  149. //          cout << l << ' ' << r << ' ' << m << endl;
  150.             ll tru = 0;
  151.             for(int i = 0; i < (tn - m + 1); i++)
  152.             {
  153.                 ll val = get(i, i + m - 1, n);
  154. //              cout << "\t" << i << ' ' << (i + m - 1) << ' ' << val << endl;
  155.                 tru |= (val != 1);
  156.             }
  157.             if(tru)
  158.                 l = m + 1;
  159.             else
  160.             {
  161.                 r = m - 1;
  162.                 ans = m;
  163.             }
  164.         }
  165.         cout << (ans > 1 ? ans : -1) << endl;
  166.     }
  167. }
Advertisement
Add Comment
Please, Sign In to add comment