思路:
为了保证为平方数,如果
的某个质因数的个数为奇数个,那么
的该质因数个数也应该是奇数个,依次类推,那么所有
中出现过的质因数在每个
中出现的次数要么都是奇数个要么都是偶数个,取代价最小的。
MyCode:
#include <bits/stdc++.h>
typedef long long ll;
const int maxn=1e6+7,mod=1000000007;
using namespace std;
bool vis[maxn];
vector<int>prime;
inline void init() {
for(int i=2;i<maxn;++i) {
if(!vis[i]) prime.emplace_back(i);
for(auto j:prime) {
if(i*j>=maxn) break;
vis[i*j]=true;
if(i%j==0) break;
}
}
}
int a[maxn],n,b[maxn],to[maxn],head[maxn],tot;
inline int ins(int x) {
if(head[x]) return head[x];
to[++tot]=x; return head[x]=tot;
}
int qpow(int a,int b) {
int res=1;
while(b) {
if(b&1) res=1LL*res*a%mod;
a=1LL*a*a%mod;
b>>=1;
}
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
init();
cin>>n;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1,x,pos,cnt;i<=n;++i) {
x=a[i];
for(auto j:prime) {
if(x<j) break;
if(!vis[x]) {
b[ins(x)]+=1;
break;
}
if(x%j==0) {
cnt=0;
while(x%j==0) x/=j,cnt+=1;
if(cnt&1) b[ins(j)]+=1;//b[ins[j]]+=(cnt&1!=0)会比较好理解
}
}
}
int ans(1);
for(int i=1;i<=tot;++i) {
if(b[i]*2>n) b[i]=n-b[i];
ans=1LL*ans*qpow(to[i],b[i])%mod;
}
cout<<ans<<'\n';
return 0;
} 
京公网安备 11010502036488号