平方
平方
题意
给定 \(n\) 个数,然后让你拟定一个长度为 \(n\) 的数组 \(t\),使得 \(t_i>1\),且满足对于任意的 \(a_i\times a_{i+1}\times t_i\times t_{i+1}\) 为完全平方数,求 \(\min\prod t_i\)。
\(1\le n\le 10^5,1\le a_i\le 10^6\)。
考虑质因数之间是独立的关系,我们按照每种质因数在每个数中的奇偶性考虑。
性质:对于一个完全平方数,它的任意一个质因子都是偶数次幂。
我们考虑到对于某个质因子,每个数可能是偶数次幂,也可能是奇数次幂。
发现要么将所有偶数次幂的数变为奇数次幂,要么反过来。
每次修改必然只乘一个质因子,那么答案就乘 \(p^{\min}\),奇数次幂/偶数次中较少者为 \(\min\)。
#include<cstdio>
using namespace std;
#define Ed for(int i=h[x];~i;i=ne[i])
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=l;i>r;--i)
#define Le(i,l,r) for(int i=l;i<=r;++i)
#define Re(i,l,r) for(int i=l;i>=r;--i)
#define L(i,l) for(int i=0;i<l;++i)
#define E(i,l) for(int i=1;i<=l;++i)
#define W(t) while(t--)
#define Wh while
namespace fstIO{
const char _fg='\n';
int _len=0;
char ibuf[(1<<20)+1],*iS,*iT,_out[(1<<25)+1],_ar[50];
#define _gh()\
(iS==iT?iT=(iS=ibuf)+fread(ibuf,1,(1<<20)+1,stdin),\
(iS==iT?EOF:*iS++):*iS++)
#define putc(ch) _out[_len++]=ch
void read(){}
template<typename Type,typename...Types>
void read(Type&x,Types&...xs){
x=0;
char ch=_gh();
char t=0;
while(ch<'0'||ch>'9')t|=ch=='-',ch=_gh();
while(ch>='0'&&ch<='9')x=x*10+(ch^48),ch=_gh();
x=t?-x:x;
read(xs...);
}
template<typename Type>
void write(Type x){
int tot=0;
if(!x)putc('0');
if(x<0)putc('-'),x=-x;
while(x)_ar[++tot]=x%10+'0',x/=10;
for(int i=tot;i;--i)putc(_ar[i]);
putc(_fg);
}
void flush(){
fwrite(_out,1,_len,stdout);
_len=0;
}
}
using namespace fstIO;
const int N=100010,M=10*N,mod=1000000007;
int n,p[N],tot,maxn,st[M],c[N];
typedef long long ll;
int min(int a,int b){
return a<b?a:b;
}
int qpow(ll a,int b){
ll res=1;
Wh(b){
if(b&1)res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
int main(){
freopen("square.in","r",stdin);
freopen("square.out","w",stdout);
read(n);
Ls(i, 2, M){
if(!st[i])p[++tot]=i,st[i]=tot;
for(int j=1;j<=tot&&p[j]*i<M;++j){
st[p[j]*i]=j;
if(i%p[j]==0)break;
}
}
E(i, n){
int x,lst=0,cnt=0;
read(x);
for(;x>1;x/=p[st[x]]){
if(st[x]!=lst){
c[lst]+=cnt&1;
cnt=1;
lst=st[x];
}
else++cnt;
}
c[lst]+=cnt&1;
}
int ans=1;
E(i, tot)
ans=1ll*ans*qpow(p[i],min(c[i],n-c[i]))%mod;
printf("%d",ans);
return 0;
}