rt,只过样例。

/*
5
4 6 9 3 6
*/
/*
30
15 15 3 30 9 30 27 11 5 15 20 10 25 20 30 15 30 15 25 5 10 20 7 7 16 2 7 7 28 7
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define x first
#define y second
#define PII pair<int, int>
using namespace std;
const int N = 500005;
int n;
int a[N];
int num, max_val, res[N];
int f[N][35], gc[N][35];
PII ask(int l, int r)
{
PII tmp;
int len = (int)log(r - l + 1) / log(2);
tmp.x = __gcd(gc[l][len], gc[l + r - l + 1 - (1 << len)][len]);
tmp.y = min(f[l][len], f[l + r - l +1 - (1 << len)][len]);
return tmp;
}
bool check(int l, int r)
{
auto t = ask(l, r);
if (t.x == t.y) return 1;
return 0;
}
int main()
{
// freopen("point.in", "r", stdin);
// freopen("point.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
for (int i = 1; i <= n; i ++ ) f[i][0] = a[i], gc[i][0] = a[i];
for (int j = 1; (1 << j) <= n; j ++ )
for (int i = 1; i + (1 << j) - 1 <= n; j ++ )
f[i][j] = min(f[i][j - 1], f[i + (1 <<(j - 1))][j - 1]), gc[i][j] = __gcd(gc[i][j - 1], gc[i + (1 << (j - 1))][j - 1]);
for (int l = 1; l <= n; l ++ )
for (int r = n; r >= l; r -- )
{
if (r - l < max_val) break;
if (check(l, r))
{
if (r - l == max_val)
{
num ++ ;
res[num] = l;
}
else if (r - l > max_val)
{
max_val = r - l;
num = 1;
memset(res, 0, sizeof res);
res[num] = l;
}
}
}
sort(res + 1, res + num + 1);
printf("%d %d\n", num, max_val);
for (int i = 1; i <= num; i ++ ) printf("%d ", res[i]);
return 0;
}