2019.7.12 义乌模拟赛 T1 square
考试的时候自己是个sb。
首先对于每个质因数答案互相独立。
然后我们要让有某个质因数的左右都有这个质因数。
那么我们对于一个有\(n\)个的质因数,要么让这\(n\)个位置都有这个质因数,要么让其余各处有这个质因数。然后就好做了。
code:
#include<bits/stdc++.h>
#define I inline
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(x) ((x)>0?(x):-(x))
#define re register
#define ll long long
#define db double
#define N 1000000
#define M 500000
#define mod 1000000007
#define eps (1e-7)
#define U unsigned int
#define it iterator
#define Gc() getchar()
#define Me(x,y) memset(x,y,sizeof(x))
using namespace std;
int n,m,k,pr[N+5],las[N+5],ph,now,Maxn,A[N+5],F[N+5];ll ans=1,tot,pus,B[N+5],C[N+5];
I ll mpow(ll x,int y=mod-2){ll ans=1;while(y) (y&1)&&(ans=ans*x%mod),y>>=1,x=x*x%mod;return ans;}
int main(){
freopen("square.in","r",stdin);freopen("square.out","w",stdout);
re int i,j;scanf("%d",&n);for(i=1;i<=n;i++) scanf("%d",&A[i]),Maxn=max(Maxn,A[i]);
for(i=2;i<=Maxn;i++){
!las[i]&&(pr[++ph]=i,las[i]=i);for(j=1;j<=ph&&pr[j]*i<=Maxn;j++){
las[pr[j]*i]=pr[j];if(i%pr[j]==0) break;
}
}
for(i=1;i<=n;i++){
now=A[i];while(now^1) F[las[now]]^=1,now/=las[now];
B[i]=1;now=A[i];while(now^1) F[las[now]]&&(B[i]*=las[now],F[las[now]]=0),now/=las[now];
}
for(i=1;i<=n;i++){now=B[i];while(now^1) F[las[now]]++,now/=las[now];}
for(i=1;i<=Maxn;i++) ans=ans*(F[i]>(n/2)?(mpow(i,n-F[i])):mpow(i,F[i]))%mod;
printf("%lld\n",ans);
}

浙公网安备 33010602011771号