Problem Description
Given a number sequence
A1,A2....An
,indicating
N=∏ni=1iAi
.What is the product of all the divisors of N?
Input
There are multiple test cases.
First line of each case contains a single integer n. (1≤n≤105)
Next line contains n integers A1,A2....An ,it's guaranteed not all Ai=0 . (0≤Ai≤105) .
It's guaranteed that ∑n≤500000 .
First line of each case contains a single integer n. (1≤n≤105)
Next line contains n integers A1,A2....An ,it's guaranteed not all Ai=0 . (0≤Ai≤105) .
It's guaranteed that ∑n≤500000 .
Output
For each test case, please print the answer module
109+7
in a line.
Sample Input
4 0 1 1 0 5 1 2 3 4 5
Sample Output
36 473272463要注意过程当中的溢出问题#include<cstdio> #include<cmath> #include<queue> #include<stack> #include<cstring> #include<vector> #include<algorithm> using namespace std; typedef long long LL; const LL base = 1e9 + 7; const LL mod = 1e9 + 6; const int maxn = 100005; int n, a[maxn], f[maxn], p[maxn], tot = 0, x; LL ans[maxn], qur, L[maxn], R[maxn]; struct point { int x, y; point(int x = 0, int y = 0) :x(x), y(y){} }; vector<point> map[maxn]; void pre() { for (int i = 2; i < maxn; i++) { if (!f[i]) { map[i].push_back(point(tot, 1)); f[i] = tot; p[tot++] = i; } else { for (int j = 0; j < tot; j++) if (i%p[j] == 0) { int u = i / p[j], v = 1; for (int k = 0; k < map[u].size(); k++) if (map[u][k].x != j) map[i].push_back(map[u][k]); else v += map[u][k].y; map[i].push_back(point(j, v)); break; } } for (int j = 0; j < tot&&i*p[j] < maxn; j++) { f[i*p[j]] = -1; if (i%p[j] == 0) break; } } } LL get(LL x, LL y) { LL ans = 1; for (x %= base; y; y >>= 1) { if (y & 1) ans = ans*x%base; x = x*x%base; } return ans; } int main() { pre(); while (scanf("%d", &n) != EOF) { for (int i = 0; i <= tot; i++) ans[i] = 0; for (int i = 1; i <= n; i++) { scanf("%d", &x); for (int j = 0; j < map[i].size(); j++) { ans[map[i][j].x] += (LL)map[i][j].y*x; } } for (int i = 0; i < tot; i++) { L[i] = (ans[i] + 1) % mod; if (i) L[i] = L[i] * L[i - 1] % mod; } for (int i = tot; i; i--) { R[i] = (ans[i] + 1) % mod; if (i < tot) R[i] = R[i] * R[i + 1] % mod; } qur = 1; for (int i = 0; i < tot; i++) { LL u = ans[i], v = ans[i] + 1; if (u % 2 == 0) u = u / 2; else v = v / 2; u = (u%mod)*(v%mod) % mod; if (i) u = u*L[i - 1] % mod; u = u*R[i + 1] % mod; qur = qur*get(p[i], u) % base; } printf("%I64d\n", qur); } return 0; }