fork(2) download
  1. #include <stdio.h>
  2.  
  3. typedef long long int lli;
  4.  
  5. lli gcd(lli x,lli y){if(y==0)return x;return gcd(y,x%y);}
  6.  
  7. /* rögzített n-re legyen G(k)=gcd(a[k],a[k+1],...,a[n])
  8.   ekkor r<s-re G(r)|G(s) így G() monoton növő
  9.   és G() legfeljebb log2(a[n])+1<50 különböző értéket vehet fel
  10.   csak a különböző G értékeket tároljuk és hogy ezeket milyen hosszan veszi fel ( ez utóbbit az L tömbben )
  11.   , ha n-et 1-gyel növeljük akkor nyilván új G(k)=gcd(G(k),a[n+1]).
  12. */
  13. int main(void){
  14.  
  15. int i,j,k,n,len,len2,L[50];
  16. lli a,ans,value,G[50];
  17.  
  18. scanf("%d%lld",&n,&G[0]);
  19. ans=G[0];L[0]=1;len=1;
  20. for(i=1;i<n;i++){
  21. scanf("%lld",&a);
  22. for(j=len-1;j>=0;j--)G[j+1]=gcd(G[j],a),L[j+1]=L[j]+1;
  23. G[0]=a;L[0]=1;
  24. len2=0;
  25. for(j=0;j<=len;j=k){
  26. for(k=j;k<=len&&G[k]==G[j];k++);
  27. G[len2]=G[j];L[len2]=L[k-1];
  28. value=(lli)G[len2]*L[len2];len2++;
  29. if(value>ans)ans=value;
  30. }
  31. len=len2;
  32. }
  33. printf("%lld\n",ans);
  34.  
  35. return 0;
  36. }
  37.  
Success #stdin #stdout 0s 2252KB
stdin
5
30 60 20 20 20
stdout
80