预处理一下所有因子,正反各跑一遍,记录下即可。
附代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#define LL long long int
using namespace std;
vector <int> mv[100002];
int n;
int v[100002];
int mark[100002];
LL b[100002];
LL c[100002];
void init()
{
for (int i=1;i*i<=100000;i++)
{
mv[i*i].push_back(i);
for (int t=i+1;i*t<=100000;t++)
{
mv[i*t].push_back(i);
mv[i*t].push_back(t);
}
}
}
int main()
{
init();
while (scanf("%d",&n)&&n)
{
for (int i=1;i<=n;i++)
scanf("%d",&v[i]);
memset(mark,-1,sizeof(mark));
for (int i=1;i<=n;i++)
{
if (mark[v[i]]==-1)
b[i]=v[i];
else
b[i]=mark[v[i]];
int len=mv[v[i]].size();
for (int t=0;t<len;t++)
{
int p=mv[v[i]][t];
mark[p]=v[i];
}
}
memset(mark,-1,sizeof(mark));
for (int i=n;i>=1;i--)
{
if (mark[v[i]]==-1)
c[i]=v[i];
else
c[i]=mark[v[i]];
int len=mv[v[i]].size();
for (int t=0;t<len;t++)
{
int p=mv[v[i]][t];
mark[p]=v[i];
}
}
LL ans=0;
for (int i=1;i<=n;i++)
ans+=b[i]*c[i];
printf("%I64d\n",ans);
}
}