给定组成一个数的质因子序列,求其所有因子的乘积
一个质因子的贡献为
化简得
由于可能为一个大数,根据费马小定理
进行降所以对
所以对模
但是
可能很大,需要在计算过程中不断取模,
因为除法不满足取模性质,所以不可以直接外提,且mod-1不是质数,2不存在逆元,考虑将模数扩大2倍消除其影响mod*2-2
#include<bits/stdc++.h>
using namespace std;
const int MAX=2e5+5;
const long long MOD=1e9+7;
int n,a[MAX];
map<int,long long>mp;
map<int,long long>::iterator p;
long long pow(long long a,int k,long long mod)
{
long long b=1;
while(k)
{
if(k&1) b=b*a%mod;
a=a*a%mod;
k>>=1;
}
return b;
}
int main()
{
long long x;
while(~scanf("%d",&n))
{
mp.clear();
for(int i=0;i<n;++i)
{
scanf("%d",&x);
if(mp.find(x)!=mp.end()) ++mp[x];
else mp[x]=1;
}
long long x=1;
for(p=mp.begin();p!=mp.end();++p)
x=x*(p->second+1)%(MOD*2-2);
long long mul=1;
for(p=mp.begin();p!=mp.end();++p)
{
mul=mul*pow(p->first,(x*p->second/2)%(MOD-1),MOD)%MOD;
}
printf("%lld\n",mul);
}
return 0;
}