#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
const long double eps = 1e-7;
const int inf = 1000000010;
const long long INF = 10000000000000010LL;
const int mod = 1000000007;
const int MAXN = 100010, LOG = 20;
long long n, m, k, u, v, x, y, t, a, b, ans;
int ps[MAXN];
vector<int> D[MAXN];
long long powmod(long long a, long long b) {
  if (!b) return 1;
  if (b & 1) return a * powmod(a * a % mod, b >> 1) % mod;
  return powmod(a * a % mod, b >> 1);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  for (int i = 1; i < MAXN; i++)
    for (int j = i; j < MAXN; j += i) D[j].push_back(i);
  cin >> n;
  for (int i = 0; i < n; i++) cin >> x, ps[x]++;
  for (int i = MAXN - 2; i; i--) ps[i] += ps[i + 1];
  for (int mx = 1; ps[mx]; mx++) {
    long long tmp =
        powmod(D[mx].size(), ps[mx]) - powmod(D[mx].size() - 1, ps[mx]);
    if (tmp < mod) tmp += mod;
    for (int i = 0; i < D[mx].size() - 1; i++)
      tmp = tmp * powmod(i + 1, ps[D[mx][i]] - ps[D[mx][i + 1]]) % mod;
    ans += tmp;
  }
  ans %= mod;
  cout << ans << '\n';
  return 0;
}
