题意很简洁,当时B却一直没看懂。。。
![这里写图片描述](https://img-blog.csdn.net/20160109134747855)
那么N的约数ALL个数是
![这里写图片描述](https://img-blog.csdn.net/20160109134833639)
这里求的是约数的乘积,显然如果ALL为奇数说明a[i]均为偶数,答案就是
![这里写图片描述](https://img-blog.csdn.net/20160109134858388)
否则答案就是,ALL = ALL / 2,
![这里写图片描述](https://img-blog.csdn.net/20160109134924849)
指数都要降幂,模MOD-1,考虑到2关于MOD-1的逆元不存在,要预先取出一个奇数的a[i]进行除2操作,并记录后面不要重复计算这个a[i]即可。
#include <bits/stdc++.h>
#define LL long long
using namespace std;
int n,m;
LL cnt[200005],MOD=1000000007;
LL pow_mod(LL a,LL b,LL mod){
LL ans=1LL;
a%=mod;
while(b){
if(b&1LL)ans=ans*a%mod;
b>>=1LL;
a=a*a%MOD;
}
return ans;
}
int main()
{
cin>>n;
for(int i=0;i<n;++i){
scanf("%d",&m);
++cnt[m];
}
LL w=1LL;bool f=false;
int k;
for(int i=0;i<=200000;++i){
if(cnt[i]%2==1){
w=cnt[i]+1,k=i;w/=2;f=true;break;
}
}
for(int i=0;i<=200000;++i)if(cnt[i]!=0LL){
if(k==i)continue;
w*=cnt[i]+1LL;
w%=(MOD-1LL);
}
LL ans=1LL;
if(!f)
for(int i=0;i<=200000;++i){
if(cnt[i]!=0LL){
ans*=pow_mod(i,((cnt[i]/2LL)%(MOD-1LL)*w)%(MOD-1LL),MOD);
ans%=MOD;
}
}
else {
for(int i=0;i<=200000;++i){
if(cnt[i]!=0LL){
ans*=pow_mod(i,((cnt[i])%(MOD-1LL)*w)%(MOD-1LL),MOD);
ans%=MOD;
}
}
}
printf("%I64d\n",ans);
}