4668. 【NOIP2016提高A组模拟7.19】腐败

12 篇文章 0 订阅
8 篇文章 0 订阅

Description

Input

第一行一个正整数n,表示序列长度
第二行n个正整数,为给出的序列A

Output

一个非负整数,为答案。

Sample Input

3

6 4 12

Sample Output

13824

Data Constraint

50%:n<=3000;
100%:n<=30000,A[i]<=10^7

 

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 30010
#define MA 10000010
#define ll long long
#define M 100000000009
using namespace std;
ll ans=1;
ll n,m,x,y,a[N],s[N*18],p[N*18],k[N*18],tot=0;
bool bz[MA];
void qs(int l,int r){
	int i=l,j=r,m=p[(l+r)/2],m2=k[(l+r)/2];
	while(i<=j){
		while(m>p[i]||(m==p[i]&&m2>k[i])) i++;
		while(m<p[j]||(m==p[j]&&m2<k[j])) j--;
		if(i<=j){swap(p[i],p[j]);swap(k[i],k[j]);i++;j--;}
	}
	if(l<j) qs(l,j);
	if(i<r) qs(i,r);
}
ll ksc(ll x,ll y){
	ll sum=0;
	while(y){
		if(y&1) sum=(sum+x)%M;
		x=(x*2)%M;y>>=1;
	}
	return sum;
}
ll ksm(ll x,ll o){
	if(o==0) return 1;
	if(o==1) return x%M;
	ll t=ksm(x,o/2);
	if(o%2==0){return ksc(t,t);}
	else{return ksc(ksc(t,t),x);}
}
void fen(int x){
	for(int i=1;i<=s[0];i++){
		if(x==1) return;
		if(x%s[i]==0){
			p[++p[0]]=s[i];
			while(x%s[i]==0){x/=s[i];k[p[0]]++;}
		}
	}
	if(x>1) p[++p[0]]=x,k[p[0]]=1;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){scanf("%d",&a[i]);m=max(m,a[i]);}
	for(int i=2;i<=3200;i++){
		if(!bz[i]) s[++s[0]]=i;
		for(int j=1;j<=s[0]&&i*s[j]<=m;j++){
			bz[i*s[j]]=1;
			if(i%s[j]==0) break;
		}
	}
	for(int i=1;i<=n;i++) fen(a[i]);
	qs(1,p[0]);
	for(int i=1;i<=p[0];i++){
		if(p[i]==p[i+1]) {k[i+1]+=k[i],tot+=k[i];}
		else{ans=ksc(ans,ksm((ll)p[i],(ll)tot+k[i]));tot=0;}
	}
	printf("%lld\n",ans);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值