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);        
}

Download