BZOJ 4488: [Jsoi2015]最大公约数 暴力 + gcd

Code: 

#include <bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin) 
#define maxn 100004 
#define ll long long  
using namespace std;   

ll gcd(ll a,ll b) { 
    return b?gcd(b,a%b):a;   
}

ll arr[maxn],gc[maxn]; 
int pos[maxn],b[maxn]; 

int main() {
    // setIO("input");   
    int n,i,j,top=0,tmp=0; 
    ll ans=0;  
    scanf("%d",&n);  
    for(i=1;i<=n;++i) { 
        scanf("%lld",&arr[i]);                 
        for(j=1;j<=top;++j) gc[j]=gcd(gc[j],arr[i]);   
        gc[++top]=arr[i], pos[top]=i;      
        b[tmp=1]=1;  
        for(j=2;j<=top;++j) if(gc[j]!=gc[j-1]) b[++tmp]=j;   
        top=0; 
        for(j=1;j<=tmp;++j) {
            gc[++top]=gc[b[j]],pos[top]=pos[b[j]];    
            ans=max(ans,1ll*(i-pos[top]+1)*gc[top]);           
        }  
    } 
    printf("%lld\n",ans);   
    return 0; 
}

  

上一篇:[JSOI2015]最大公约数


下一篇:BZOJ 4488: [Jsoi2015]最大公约数