题意:给出一个数
x
的所有质因子,求这个数所有因子的乘积%1e9+7。
思路:一个因子a 必然有另一个因子
b
与它对应使得a∗b=x 。设总因子数为
k
,所以答案就应该是xk2 。这个
k
是怎么求的呢?因为x=a1k1∗a2k2∗…∗ankn 则
k=(k1+1)∗(k2+1)∗…∗(kn+1)
k=(k1+1)∗(k2+1)∗…∗(kn+1)
处理 xk2 要非常注意。在这里被坑了好久。
PS:c++11 auto真是好用的说。
/*********************************************
Problem : Codeforces
Author : NMfloat
InkTime (c) NM . All Rights Reserved .
********************************************/
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define rep(i,a,b) for(int i = (a) ; i <= (b) ; i ++) //遍历
#define rrep(i,a,b) for(int i = (b) ; i >= (a) ; i --) //反向遍历
#define repS(it,p) for(auto it = p.begin() ; it != p.end() ; it ++) //遍历一个STL容器
#define repE(p,u) for(Edge * p = G[u].first ; p ; p = p -> next) //遍历u所连接的点
#define cls(a,x) memset(a,x,sizeof(a))
#define eps 1e-8
using namespace std;
//const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e5+5;
const int MAXE = 2e5+5;
long long MOD = 1e9+7;
typedef long long LL;
typedef unsigned long long ULL;
int T,n,m,k;
int fx[] = {0,1,-1,0,0};
int fy[] = {0,0,0,-1,1};
map<int,int>mp;
LL ans ;
void input() {
int tmp;
ans = 1;
mp.clear();
rep(i,1,n) {
scanf("%d",&tmp);
mp[tmp]++ ; ans = (ans * (LL)tmp) % MOD;
}
}
LL quick_pow(LL base , LL mult) {
LL ret = 1;
while(mult) {
if(mult & 1) ret = (ret * base) % MOD;
base = ( base * base ) % MOD;
mult >>= 1;
}
return ret;
}
void solve() {
LL mult = 1 , ss = 1;
int ok = 0 ;
auto pos = mp.begin();
repS(it,mp) {
if(it->second & 1) { ok = 1; pos = it;}
ss = (ss * quick_pow(it->first,it->second/2)) % MOD;
}
if(ok) {
repS(it,mp) {
if(pos == it) {
ans = quick_pow(ans,(it->second+1)/2);
}
else {
ans = quick_pow(ans,it->second+1);
}
}
}
else {
ans = ss;
repS(it,mp) {
ans = quick_pow(ans,it->second+1);
}
}
printf("%I64d\n",ans);
}
int main(void) {
// freopen("a.in","r",stdin);
while(~scanf("%d",&n)) {
input();
solve();
}
return 0;
}