#include<bits/stdc++.h>
using namespace std;
long long sum,ans,n,ll,rr,xx,a[200005],cnt=1,c[200005],x[5][2000005];
vector<int> b[200005];
struct node{
long long val;
int lf,ri,ls,rs,mx,nd,lz;
}t[4000005];
void build(int l,int r,int x){
t[x].lf=l,t[x].ri=r;
if(l>=r){
t[x].nd=l;
t[x].val=l;
t[x].mx=l;
return;
}
int mid=(l+r)/2;
t[x].ls=++cnt,t[x].rs=++cnt;
build(l,mid,t[x].ls);
build(mid+1,r,t[x].rs);
t[x].val=t[t[x].ls].val+t[t[x].rs].val;
t[x].mx=r;
return;
}
void pd(int x){
if(!t[x].lz)return;
t[t[x].ls].lz=t[x].lz;
t[t[x].ls].val=1ll*t[x].lz*(t[t[x].ls].ri-t[t[x].ls].lf+1);
t[t[x].ls].mx=t[x].lz;
t[t[x].rs].lz=t[x].lz;
t[t[x].rs].val=1ll*t[x].lz*(t[t[x].rs].ri-t[t[x].rs].lf+1);
t[t[x].rs].mx=t[x].lz;
t[x].lz=0;
}
void add(int l,int r,int x){
if(l>rr||r<ll)return;
if(l>=ll&&r<=rr){
t[x].val=1ll*xx*(r-l+1);
t[x].mx=xx;
t[x].lz=xx;
return;
}
pd(x);
int mid=(l+r)/2;
add(l,mid,t[x].ls);
add(mid+1,r,t[x].rs);
t[x].val=t[t[x].ls].val+t[t[x].rs].val;
t[x].mx=max(t[t[x].ls].mx,t[t[x].rs].mx);
return;
}
long long fid(int l,int r,int x,int y){
if(l>=r){
return t[x].nd;
}
pd(x);
int mid=(l+r)/2;
if(t[t[x].ls].mx<y)return fid(mid+1,r,t[x].rs,y);
else return fid(l,mid,t[x].ls,y);
}
int main(){
scanf("%lld",&n);
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]),b[a[i]].push_back(i);
}
build(1,n,1);
for(int i=1;i<=200000;++i){//枚举i的倍数位置
x[1][i]=x[2][i]=1e9+7,x[3][i]=x[4][i]=0;
for(int j=1;j*i<=200000;++j){
// printf("%d %d\n", i * j, b[i * j].size());
if(b[j*i].size()){
for(int k=0;k<b[i*j].size()&&k<2;++k){
// cout<<k<<' ';
if(b[i*j][k]<x[1][i])x[2][i]=x[1][i],x[1][i]=b[i*j][k];
else if(b[i*j][k]<x[2][i])x[2][i]=b[i*j][k];
}
// cout<<endl;
// printf("###%d\n",k);
for(int k=b[i*j].size()-1;k>=0&&k>b[i*j].size()-3;--k){
// cout<<k<<' ';
// printf("hi!\n");
if(b[i*j][k]>x[4][i])x[3][i]=x[4][i],x[4][i]=b[i*j][k];
else if(b[i*j][k]>x[3][i])x[3][i]=b[i*j][k];
}
// cout<<endl;
}
}
// if(i>15)continue;
// for(int j=1;j<=4;++j)cout<<x[j][i]<<' ';
// cout<<endl;
}
for(int i=1;i<=200000;++i)b[i].clear();
for(long long i=200000;i>=1;--i){
if(x[3][i]==0)continue;
// cout<<"________________________"<<i<<endl;
// for(int j=1;j<=20;++j){
// cout<<t[j].lf<<' '<<t[j].ri<<' '<<t[j].val<<' '<<t[j].mx<<' '<<t[j].lz<<endl;
// }
sum=t[1].val;
xx=n+1,ll=x[2][i]+1,rr=n;
add(1,n,1);
long long k=fid(1,n,1,x[3][i]);
// cout<<"K="<<k<<endl;
ll=1,rr=min(k-1,x[1][i]),xx=x[3][i];
// cout<<"LLRR"<<ll<<' '<<rr<<' '<<x[3][i]<<endl;
add(1,n,1);
k=fid(1,n,1,x[4][i]);
// cout<<"K="<<k<<endl;
rr=min(x[2][i],k-1);
ll=x[1][i]+1;
xx=x[4][i];
add(1,n,1);
sum-=t[1].val;
// cout<<i<<' '<<sum<<endl;
ans-=sum*i;
}
// cout<<t[1].val<<endl;
// ans+=t[1].val;
cout<<ans;
return 0;
}
为什么把k>b[i*j].size()-3改成k+3>b[i*j].size()就能过?