#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
const long long mod = 1000000007;
struct node {
  vector<int> factor;
} s[maxn];
void initialization() {
  for (int i = 1; i <= maxn; i++) {
    int MAX = floor(sqrt(i)), k = 1;
    for (int j = 1; j <= MAX; j++)
      if (i % j == 0) {
        s[i].factor.push_back(j);
        if (i / j != j) s[i].factor.push_back(i / j);
      }
    sort(s[i].factor.begin(), s[i].factor.end());
  }
}
long long POW(long long x, int y) {
  long long ans = 1;
  while (y) {
    if (y & 1) {
      ans *= x;
      ans %= mod;
    }
    y >>= 1;
    x *= x;
    x %= mod;
  }
  return ans;
}
int a[maxn], sum[maxn], n;
int main() {
  initialization();
  while (~scanf("%d", &n)) {
    memset(sum, 0, sizeof(sum));
    for (int i = 0; i < n; i++) {
      scanf("%d", &a[i]);
      sum[a[i]]++;
    }
    for (int i = 1; i < maxn; i++) sum[i] += sum[i - 1];
    long long ans = 0;
    for (int i = maxn - 1; i > 0; i--)
      if (n > sum[i - 1]) {
        long long num = 1;
        int m = n;
        for (int j = s[i].factor.size() - 1; j >= 0; j--) {
          int t = m - sum[s[i].factor[j] - 1];
          if (t > 0) {
            if (j == s[i].factor.size() - 1)
              num *= ((POW(j + 1, t) - POW(j, t) + mod) % mod);
            else
              num *= POW(j + 1, t);
            num %= mod;
            m -= t;
          }
        }
        ans += num;
        ans %= mod;
      }
    printf("%lld\n", ans);
  }
  return 0;
}
