记录编号 503718 评测结果 AAAAAAAATT
题目名称 选拔(select) 最终得分 80
用户昵称 Gravatar落痕 是否通过 未通过
代码语言 C++ 运行时间 2.037 s
提交时间 2018-08-04 19:48:41 内存使用 23.21 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#define ll long long
#define DB double 
#define eps 1e-6
using namespace std;
inline int read()
{
	int x=0,w=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-') w=-1;ch=getchar();}
	while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
	return x*w;
}
const int N=1e6+20;
int n,h[N],a[N],l,p[N],cnt[N]; 
ll k1,v[N];
void work()
{
	v[0]=v[1]=1;
	for(int i=2;i<=n;++i)
	{
		if(!v[i]) p[++p[0]]=i;
		for(int j=1;j<=p[0] && i*p[j]<=n;++j)
		{
			v[i*p[j]]=1;
			if(i%p[j]==0) break;
		}
	}
	for(int i=1;i<=p[0];++i)
	{
		k1=n;
		while(k1/p[i]) cnt[i]+=k1/p[i],k1/=p[i];
	}k1=0;
}
void fen(int x)
{
	for(int i=1;i<=p[0];++i)
	{
		k1=x;
		while(k1/p[i]) cnt[i]-=k1/p[i],k1/=p[i];
	}
}
void mul(ll x)
{
    for(int i=1;i<=v[0];++i) v[i]*=x;
    for(int i=1;i<=v[0];++i)
    {
    	v[i+1]+=v[i]/10;
    	v[i]%=10;
	}
	v[0]++;
	while(v[v[0]]>=10)
	{
		v[v[0]+1]+=v[v[0]]/10;
		v[v[0]]%=10;
		v[0]++;
	}
	while(v[v[0]]==0) v[0]--;
}
int main()
{
	freopen("select.in","r",stdin);
	freopen("select.out","w",stdout);
    n=read();
    for(int i=1;i<=n;++i) h[i]=read();
    sort(h+1,h+n+1);
    for(int i=1;i<=n;++i)
     if(h[i]==h[i-1]) a[l]++;
     else h[++l]=h[i],a[l]++;
    work();
    for(int i=1;i<=l;++i) fen(a[i]);
    for(int i=1;i<=n;++i) v[i]=0;
	v[1]=1;v[0]=1;
	for(int i=1;i<=p[0];++i)
	{
		ll x=1;
		for(int j=1;j<=cnt[i];++j) 
		{
			x=x*p[i];
			if(x>=1e12 && j!=cnt[i]) mul(x),x=1;
			if(j==cnt[i]) mul(x);
		}
	}
	for(int i=v[0];i>=1;--i) cout<<v[i];
    return 0;
}