C11ID - Mã số
Tác giả: skyvn97
Ngôn ngữ: C++
#include<stdio.h>
#define MAX 100100
#define MOD 1000000007
typedef unsigned long long ull;
ull a[MAX];
ull i,n,t;
ull min(ull x, ull y)
{
if (x>y) return(y); else return(x);
}
void merge(ull a[],ull left, ull mid, ull right)
{
ull b[MAX];
ull c[MAX];
ull i,ib,ic;
for (i=1;i<=mid-left+1;i=i+1) b[i]=a[i+left-1];
for (i=1;i<=right-mid;i=i+1) c[i]=a[i+mid];
ib=1; ic=1;
for (i=left;i<=right;i=i+1)
{
if (ib>mid-left+1) a[i]=c[ic];
else
if (ic>right-mid) a[i]=b[ib];
else a[i]=min(b[ib],c[ic]);
if (a[i]==b[ib]) ib=ib+1;
else ic=ic+1;
}
}
void mergesort(ull a[],ull left,ull right)
{
if (right<=left) return;
ull mid=(right+left)/2;
mergesort(a,left,mid);
mergesort(a,mid+1,right);
merge(a,left,mid,right);
}
int main(void)
{
scanf("%llu",&n);
for (i=1;i<=n;i=i+1) scanf("%llu",&a[i]);
mergesort(a,1,n);
t=1;
for (i=1;i<=n;i=i+1) t=(t*(a[i]-i+1))%MOD;
printf("%llu",t);
}