#include #include #include using namespace std; typedef long long ll; const int N = 100000+5; const int MOD = 1e9+7; int pri[N], pnum, mindiv[N]; bool vis[N]; void init(int n) { for(int i = 2;i <= n; i++) { if(!vis[i]) { pri[pnum++] = i; mindiv[i] = i; } for(int j = 0;j < pnum; j++) { if(i*pri[j] > n) break; vis[i*pri[j]] = 1; mindiv[i*pri[j]] = pri[j]; if(i%pri[j]==0) break; } } } ll cnt[N]; int n, a[N]; int pow_mod(ll x, ll n) { x %= MOD; int ret = 1; while(n) { if(n&1) ret = 1ll*ret*x%MOD; x = x*x%MOD; n >>= 1; } return ret; } int pre[N], suf[N]; int solve() { for(int i = 1;i <= n; i++) cnt[i] = 0; for(int i = 1;i <= n; i++) { int cur = i; while(cur > 1) { cnt[mindiv[cur]] += a[i]; cur /= mindiv[cur]; } } pre[0] = 1; for(int i = 1;i <= n; i++) { pre[i] = pre[i-1]*1ll*((cnt[i]+1)%(MOD-1))%(MOD-1); } suf[n+1] = 1; for(int i = n;i >= 1; i--) { suf[i] = suf[i+1]*1ll*((cnt[i]+1)%(MOD-1))%(MOD-1); } int ans = 1; for(int i = 1;i <= n; i++) if(cnt[i]) { int tmp = pre[i-1]*1ll*suf[i+1]%(MOD-1); int fk1 = (cnt[i]+1)%(MOD-1); int fk2 = cnt[i]%(MOD-1); int tmp2; if(cnt[i]&1) tmp2 = 1ll*((cnt[i]+1)/2%(MOD-1))*fk2%(MOD-1); else tmp2 = 1ll*fk1*(cnt[i]/2%(MOD-1))%(MOD-1); if(cnt[i] > 1000000) tmp2 += MOD-1; else if(1ll*cnt[i]*(cnt[i]+1)/2 >= MOD-1) tmp2 += MOD-1; tmp2 = pow_mod(i, tmp2); tmp = pow_mod(tmp2, tmp); ans = 1ll*ans*tmp%MOD; } return ans; } int main() { init(100000); while(scanf("%d", &n) == 1) { for(int i = 1;i <= n; i++) { scanf("%d", &a[i]); } printf("%d\n", solve()); } return 0; }