思路:
为了保证为平方数,如果的某个质因数的个数为奇数个,那么的该质因数个数也应该是奇数个,依次类推,那么所有中出现过的质因数在每个中出现的次数要么都是奇数个要么都是偶数个,取代价最小的。
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; }