原題鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4961
ac代碼:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <map>
using namespace std;
struct Node
{
long long x;
long long l, r;
};
const int M = 100000 + 10;
Node inter[M];
int hash[M];
map<int, int> m;
int main()
{
int n;
long long x;
while(~scanf("%d",&n),n)
{
for(int i = 1; i <= n; i ++)
{
scanf("%I64d", &x);
inter[i].x = inter[i].l = inter[i].r = x;
}
memset(hash, 0, sizeof(hash));
m.clear();
hash[inter[1].x] ++;
m[inter[1].x] = 1;
for(int i = 2; i <= n; i ++)
{
x = inter[i].x;
for(int k = 1; k * k <= x; k ++)
{
if(x % k == 0)
{
int j = x / k;
if(hash[k])
{
inter[m[k]].r = x;
hash[k] --;
m.erase(k);
}
if(hash[j])
{
inter[m[j]].r = x;
hash[j] --;
m.erase(j);
}
}
}
hash[x] ++;
m[x] = i;
}
memset(hash, 0, sizeof(hash));
m.clear();
hash[inter[n].x] ++;
m[inter[n].x] = n;
for(int i = n - 1; i >= 1; i--)
{
x = inter[i].x;
for(int j = 1; j * j <= x; j ++)
{
if(x % j == 0)
{
int k = x / j;
if(hash[j])
{
hash[j] --;
inter[m[j]].l = x;
m.erase(j);
}
if(hash[k])
{
hash[k] --;
inter[m[k]].l = x;
m.erase(k);
}
}
}
hash[inter[i].x] ++;
m[inter[i].x] = i;
}
long long ans = 0;
for(int i = 1; i <= n; i ++)
{
ans += inter[i].l * inter[i]. r;
}
printf("%I64d\n",ans);
// for(int i = 1; i <= n; i ++)
// printf("%d %d %d\n", inter[i].l, inter[i].x, inter[i].r);
}
return 0;
}