const int maxn = 2e5+200; const int mod = 1e9+7; int n; ll ans;
bool isprime[maxn]; ll pf[maxn]; int pn[maxn]; ll arr[maxn];
void init() { memset(isprime,true,sizeof(isprime)); for (int i = 2; i <= maxn ; i ++) { if (isprime[i]) { for (int j = i ; j <= maxn ; j+= i) { if(!pf[j]) pf[j] = i; else pf[j] *= i; pn[j]++; if (j!=i) isprime[j] = false; } } }
}
ll qp(ll a ,int n) { ll res = 1; while (n) { if (n&1) res= res*a%mod; a = a*a %mod; n >>= 1; } return res; }
ll solve(int p) { int i = 1; ll res = 1; while (i<=n) { int l = i,r = n+1 ,mid; int x = arr[i]/p; while (1) { if (l==r-1) break;
mid = (l+r)>>1; if (x==arr[mid]/p) l = mid; else r = mid; }
res = res*qp(x,l-i+1)%mod; i = l +1; } return res%mod; }
int main() { int T,t=1; init(); scanf("%d",&T);
while (T--) { ans = 0; scanf("%d",&n); for (int i = 1 ; i <= n ; i ++) scanf("%lld",&arr[i]);
sort(arr+1,arr+n+1); int up = arr[1]; for (int i = 2 ; i <= up ; i ++) { if (i!=pf[i]) continue; ll tmp = solve(i); if (pn[i]&1) ans += tmp%mod; else ans -= tmp%mod; ans %=mod; ans = (ans+mod)%mod; } printf("Case #%d: %lld\n",t++,ans%mod); }