把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

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);
}
posted @ 2021-07-12 19:52  275307894a  阅读(49)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end