这里是
处理出a[i] 倍数的位置
然后对于每个数查找下 = =。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#include <vector>
typedef long long LL;
using namespace std;
const LL mod=1e9+7;
int a[112000];
vector<int> b[10005];
vector<int> one;
int read()
{
char ch=' ';
int ans=0;
while(ch<'0' || ch>'9')
ch=getchar();
while(ch<='9' && ch>='0')
{
ans=ans*10+ch-'0';
ch=getchar();
}
return ans;
}
int main()
{
int n;
while(~scanf("%d", &n))
{
for(int i=0;i<n;i++)//a[i]=read();
scanf("%d", &a[i]);
for(int i=0;i<=10000;i++)
b[i].clear();
one.clear();
for(int i=0;i<n;i++)
{
if(a[i]==1)
one.push_back(i);
else
for(int j=a[i];j<=10000;j+=a[i])
b[j].push_back(i);
}
LL ans=0;
for(int i=0;i<n;i++)
{
int myfind=a[i],l=-1,r=n;
for(int j=0;j<one.size();j++)
{
if(one[j]<i&&one[j]>l)
l=one[j];
if(one[j]>i&&one[j]<r)
r=one[j];
}
if(myfind!=1)
for(int j=0;j<b[myfind].size();j++)
{
if(b[myfind][j]<i&&b[myfind][j]>l)
l=b[myfind][j];
if(b[myfind][j]>i&&b[myfind][j]<r)
r=b[myfind][j];
}
// printf("%d %d\n",l,r);
ans=(ans+((i-l)*(r-i))%mod)%mod;
}
printf("%I64d\n", ans%mod);
}
return 0;
}