http://codeforces.com/contest/359/problem/D
题意:给你n个数,然后找出在[l,r]中有一个数a[j],l<=j<=r,在[l,r]中的所有数都是a[j]的倍数。找出符合这样的r-l最长长度的个数,输出r-l最长长度的个数和长度,然后输出符合的l的序列。
枚举每一个数,然后向左找到l,向右找到r,r-l就是所求的符合一种,这样就可以找到最长的长度
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 300100 5 using namespace std; 6 7 int a[maxn]; 8 int n; 9 int p[maxn]; 10 11 int main() 12 { 13 while(scanf("%d",&n)!=EOF) 14 { 15 int s,t; 16 for(int i=1; i<=n; i++) 17 { 18 scanf("%d",&a[i]); 19 } 20 int max1=0; 21 int t1=0; 22 for(int i=1; i<=n; ) 23 { 24 s=i; 25 t=i; 26 while(s>=1&&a[s]%a[i]==0) s--; 27 while(t<=n&&a[t]%a[i]==0) t++; 28 i=t; 29 int len=t-s-2; 30 if(len>max1) 31 { 32 t1=0; 33 max1=len; 34 } 35 if(len==max1) 36 { 37 p[t1++]=s+1; 38 } 39 } 40 printf("%d %d\n",t1,max1); 41 for(int i=0; i<t1; i++) 42 { 43 if(i==0) printf("%d",p[i]); 44 else printf(" %d",p[i]); 45 } 46 printf("\n"); 47 } 48 return 0; 49 }