#include #include #include using namespace std; vector lastRes; int count (vector res, int x) { int r= 0; for (int i = 0; i < res.size(); i++) if (res[i] == x) r++; return r; } int common (vector *o,int i, int j) { vector res; for (int e = 0; e < o[j].size(); e++) { int cnt = count(res, o[j][e]) + 1; if (count(lastRes, o[j][e]) >= cnt) res.push_back(o[j][e]); } int out = 1; for (int e = 0; e < res.size(); e++) out *= res[e]; lastRes=res; return out; } int gcd2 (int *d, int i, int j, vector *o) { if (i == j){ lastRes=o[i]; return d[i]; } return common(o,i,j); } int max (int *d, int i, int j) { int m = 0; for (int k = i; k <= j; k++) if (d[k] > m) m = d[k]; return m; } int f (int *d, int n, vector *o) { int res = 0; for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { res = (res + gcd2(d, i, j, o) * max(d, i, j)) % 1000000007; } } return res; } int main () { int n; scanf("%d", &n); int d[n]; for (int i = 0; i < n; i++) scanf("%d", &d[i]); vector primes({2, 3, 5, 7, 11}); for (int i = 13; i < 100000; i+= 2) { int s= sqrt(i); bool res = true; for (int p = 0; p < primes.size(); p++) { if (primes[p] > s || !(i % primes[p])) { res = false; break; } } if (res) primes.push_back(i); } vector o[n]; for (int i=0;i o2; int num = d[i]; int s = sqrt(num); for (int p = 0; p < primes.size(); p++) { if (primes[p] > s || primes[p] > num) break; while (! (num % primes[p])) { num /= primes[p]; o2.push_back(primes[p]); } } if (num > 1) o2.push_back(num); o[i]=o2; } if (n<100) printf("%d\n", f(d, n, o) % 1000000007); }