源代码: #include<cstdio> #include<vector> #include<algorithm> using namespace std; struct Node { int S,P; }i[500001]; vector <int> List[500001]; int n,Ans(0),f[500001],F[500001]; bool Vis[500001]={0}; bool Rule(Node t1,Node t2) { return t1.S<t2.S; } int main() //乱搞的竟然能过,数据太水了。 { scanf("%d",&n); for (int a=1;a<=n;a++) { scanf("%d",&f[a]); i[a].S=f[a]; i[a].P=a; } sort(i+1,i+n+1,Rule); for (int a=1;a<=n;a++) { int Left=i[a].P-1,Right=i[a].P+1; Vis[i[a].P]=true; while (Left&&!Vis[Left]&&!(f[Left]%i[a].S)) Left--; while (Right<=n&&!Vis[Right]&&!(f[Right]%i[a].S)) Right++; Left++; Right--; //细节还得注意。 if (Ans<=Right-Left) { Ans=Right-Left; List[Ans].push_back(Left); } } int Sum=List[Ans].size(); sort(List[Ans].begin(),List[Ans].end()); //返回的是迭代器位置。 printf("%d %d ",Sum,Ans); for (int a=0;a<Sum;a++) printf("%d ",List[Ans][a]); return 0; } /* 不难发现,从最小的数开始枚举最优,所以升序检验。 且易得,最小的找过后就绝对不会再找了,因为模不了,打上标记。 */