Advertisement
Mehulcoder

359D

Oct 25th, 2020 (edited)
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.32 KB | None | 0 0
  1. /*
  2. Author: Mehul Chaturvedi
  3. Talent is overrated
  4. */
  5.  
  6. #include <bits/stdc++.h>
  7. using namespace std;
  8.  
  9. using ll = long long;
  10. using ld = long double;
  11. using pll = pair<ll, ll>;
  12.  
  13. #define mp make_pair
  14. #define all(x) (x).begin(), (x).end()
  15. #define f first
  16. #define s second
  17. #define vll vector<long long>
  18. #define vvll vector<vector<ll>>
  19. #define vset(v, n, val) v.clear(); v.resize(n, val)
  20. #define INF 4557430888798830399ll
  21. #define fr(i, a, b) for (int i = (a), _b = (b); i <= _b; i++)
  22. #define rep(i, n) for (int i = 0, _n = (n); i < _n; i++)
  23. #define repr(i, n) for (int i = n; i >= 0; i--)
  24. #define frr(i, a, b) for (int i = (a), _b = (b); i >= _b; i--)
  25. #define trav(a, x) for(auto& a : x)
  26. #define fil(ar, val) memset(ar, val, sizeof(ar))
  27. const ll MOD = 1e9 + 7;
  28.  
  29.  
  30. class node {
  31. public:
  32.     ll gcdd;
  33.  
  34.     node(ll val) {
  35.         gcdd = val;
  36.     }
  37.  
  38. };
  39.  
  40. vector<ll> v;
  41. vll anss;
  42. vector<node> t;
  43. vector<ll> t2;
  44. ll n, m;
  45.  
  46. node help(node left, node right) {
  47.     node res(__gcd(left.gcdd, right.gcdd));
  48.     return res;
  49. }
  50.  
  51. void build(ll start, ll tl, ll tr) {
  52.     if (tl + 1 == tr) {
  53.         t[start] = node(v[tl]);
  54.         return;
  55.     }
  56.  
  57.     ll mid = (tl + tr) / 2;
  58.     build(2 * start + 1, tl, mid);
  59.     build(2 * start + 2, mid, tr);
  60.     node left = t[2 * start + 1];
  61.     node right = t[2 * start + 2];
  62.     t[start] =  help(left, right);
  63.     return;
  64. }
  65. void build2(ll start, ll tl, ll tr) {
  66.     if (tl + 1 == tr) {
  67.         t2[start] = v[tl];
  68.         return;
  69.     }
  70.     ll mid = (tl + tr) / 2;
  71.     build2(2 * start + 1, tl, mid);
  72.     build2(2 * start + 2, mid, tr);
  73.     ll left = t2[2 * start + 1];
  74.     ll right = t2[2 * start + 2];
  75.     t2[start] =  min(left, right);
  76.     return;
  77. }
  78.  
  79. node get(ll start, ll tl, ll tr, ll l, ll r) {
  80.     if (l >= r) return 0;
  81.     if (tl == l && tr == r) return t[start];
  82.  
  83.     ll mid = (tl + tr) / 2;
  84.     node left = get(2 * start + 1, tl, mid, l, min(mid, r));
  85.     node right = get(2 * start + 2, mid, tr, max(mid, l), r);
  86.     return help(left, right);
  87. }
  88.  
  89. ll get2(ll start, ll tl, ll tr, ll l, ll r) {
  90.     if (l >= r) return INF;
  91.     if (tl == l && tr == r) return t2[start];
  92.  
  93.     ll mid = (tl + tr) / 2;
  94.     auto left = get2(2 * start + 1, tl, mid, l, min(mid, r));
  95.     auto right = get2(2 * start + 2, mid, tr, max(mid, l), r);
  96.     return min(left, right);
  97. }
  98. bool check(ll len) {
  99.     bool ok = 0;
  100.     rep(l, n) {
  101.         ll r = l + len;
  102.         if (r >= n + 1) break;
  103.         ll g = get(0, 0, n, l, r).gcdd;
  104.         if (g == get2(0, 0, n, l, r)) ok = 1;
  105.         if (ok) return 1;
  106.     }
  107.  
  108.     return ok;
  109. }
  110.  
  111. void gett(ll len) {
  112.     rep(l, n) {
  113.         bool ok = 0;
  114.         ll r = l + len;
  115.         if (r >= n + 1) break;
  116.         ll g = get(0, 0, n, l, r).gcdd;
  117.         if (g == get2(0, 0, n, l, r)) ok = 1;
  118.         if (ok) anss.push_back(l);
  119.     }
  120.  
  121.     return;
  122. }
  123.  
  124. void solve() {
  125.     cin >> n;
  126.     vset(v, n, 0);
  127.     t.clear();
  128.     t2.clear();
  129.     anss.clear();
  130.     t.resize(4 * n, node(1));
  131.     t2.resize(4 * n, INF);
  132.  
  133.     rep(i, n) cin >> v[i];
  134.  
  135.     build(0, 0, n);
  136.     build2(0, 0, n);
  137.     ll lo = 1;
  138.     ll hi = n;
  139.     ll ans = 1;
  140.  
  141.     while (lo <= hi) {
  142.         ll mid = (lo + hi) / 2;
  143.         if (check(mid)) {
  144.             lo = mid + 1;
  145.             ans = max(ans, mid);
  146.         } else {
  147.             hi = mid - 1;
  148.         }
  149.     }
  150.  
  151.     gett(ans);
  152.     sort(all(anss));
  153.     cout << anss.size() << " " << ans - 1 << '\n';
  154.     rep(i, anss.size()) {
  155.         cout << anss[i] + 1 << ' ';
  156.     }
  157.     cout << '\n';
  158.  
  159.     return;
  160. }
  161.  
  162. int main(int argc , char ** argv) {
  163.     ios_base::sync_with_stdio(false) ;
  164.     cin.tie(NULL) ;
  165.  
  166.     ll t = 1;
  167.     while (t--) {
  168.         solve();
  169.     }
  170.  
  171.     return 0 ;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement