#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool upmin(T &x, T y) {
  return y < x ? x = y, 1 : 0;
}
template <typename T>
inline bool upmax(T &x, T y) {
  return x < y ? x = y, 1 : 0;
}
const long double eps = 1e-11;
const long double pi = acos(-1);
const long long oo = 1 << 30;
const long long loo = 1ll << 62;
const long long mods = 1e9 + 7;
const long long MAXN = 1000005;
const long long MX = 999999;
const long long INF = 0x3f3f3f3f;
inline long long read() {
  long long f = 1, x = 0;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = (x << 3) + (x << 1) + (c ^ 48);
    c = getchar();
  }
  return x * f;
}
long long pw[MAXN], pw2[MAXN], s0[MAXN], s1[MAXN], s2[MAXN], P[MAXN], num[MAXN];
long long upd(long long x, long long y) {
  return x + y >= mods ? x + y - mods : x + y;
}
long long get(long long x) {
  long long ans = 0;
  if (s0[x] > 0) ans = upd(ans, 1ll * pw2[s0[x] - 1] * s2[x] % mods);
  if (s0[x] > 1)
    ans = upd(ans, 1ll * pw2[s0[x] - 2] *
                       upd(1ll * s1[x] * s1[x] % mods, mods - s2[x]) % mods);
  return ans;
}
signed main() {
  long long n = read();
  pw[0] = pw2[0] = 1;
  for (long long i = 1; i <= 6; i++) pw[i] = pw[i - 1] * 10;
  for (long long i = 1; i <= n; i++) pw2[i] = upd(pw2[i - 1], pw2[i - 1]);
  for (long long i = 1; i <= n; i++) {
    long long x = read();
    s0[x]++, s1[x] = upd(s1[x], x), s2[x] = upd(s2[x], 1ll * x * x % mods);
  }
  num[0] = 0;
  for (long long i = 1; i < 64; i++) num[i] = num[i >> 1] + (i & 1);
  for (long long j = 0; j < 64; j++)
    for (long long k = 0; k < 6; k++)
      if ((j >> k) & 1) P[j] += pw[k];
  for (long long i = MX; i >= 0; i--) {
    long long S = 0;
    for (long long j = 0; j < 6; j++)
      if ((i / pw[j]) % 10 != 9) S |= 1 << j;
    for (long long j = S; j; j = (j - 1) & S) {
      long long t = num[j];
      if (t & 1)
        s0[i] = upd(s0[i], s0[i + P[j]]), s1[i] = upd(s1[i], s1[i + P[j]]),
        s2[i] = upd(s2[i], s2[i + P[j]]);
      else
        s0[i] = upd(s0[i], mods - s0[i + P[j]]),
        s1[i] = upd(s1[i], mods - s1[i + P[j]]),
        s2[i] = upd(s2[i], mods - s2[i + P[j]]);
    }
  }
  long long ans = 0;
  for (long long i = 0; i <= MX; i++) {
    long long cnt = get(i), S = 0;
    for (long long j = 0; j < 6; j++)
      if ((i / pw[j]) % 10 != 9) S |= 1 << j;
    for (long long j = S; j; j = (j - 1) & S)
      cnt += ((num[j] & 1) ? -1 : 1) * get(i + P[j]);
    cnt = ((cnt % mods) + mods) % mods;
    ans ^= cnt * i;
  }
  printf("%lld\n", ans);
  return 0;
}
