题意: 解法: 将问题转化为每个数在多少个区间内有贡献. 定义每个数向左扩展,遇不到因子的最大位置为l[i],向右扩展的最大位置为r[i], 这个可以O(n*sq)预处理. 对于每个数a[i],有贡献的区间数量为: (i-l[i]+1)*(r[i]-i+1). code: #include<bits/stdc++.h> #define PI pair<int,int> using namespace std; const int maxm=1e5+5; const int mod=1e9+7; int l[maxm],r[maxm]; int d[maxm]; int a[maxm]; int n; signed main(){ ios::sync_with_stdio(0); while(cin>>n){ int ma=0; for(int i=1;i<=n;i++){ cin>>a[i]; ma=max(ma,a[i]); } for(int i=1;i<=ma;i++)d[i]=0; for(int i=1;i<=n;i++){ l[i]=1; for(int j=1;j*j<=a[i];j++){ if(a[i]%j==0){ if(d[j])l[i]=max(l[i],d[j]+1); if(d[a[i]/j])l[i]=max(l[i],d[a[i]/j]+1); } } d[a[i]]=i; } for(int i=1;i<=ma;i++)d[i]=0; for(int i=n;i>=1;i--){ r[i]=n; for(int j=1;j*j<=a[i];j++){ if(a[i]%j==0){ if(d[j])r[i]=min(r[i],d[j]-1); if(d[a[i]/j])r[i]=min(r[i],d[a[i]/j]-1); } } d[a[i]]=i; } int ans=0; for(int i=1;i<=n;i++){ int lc=i-l[i]+1; int rc=r[i]-i+1; ans=(ans+lc*rc%mod)%mod; } cout<<ans<<endl; } return 0; }