原题链接
对于输入数据我们升序排列,发现前一种情况必然包含在后几种情况内,对于排列后的升序列如a,b,c…第一个有a种选择,第二个排除第一个选的有b-1种选择,第三个排除第一个和第二个的选择有c-2种选择,所以我们的结果就是a*(b-1)(c-2)…很简单的数学问题!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include<stack>
#include<queue>
#define ll long long
using namespace std;
#define mod 1000000007
ll a[1010];
int main()
{
ll n;
cin >> n;
for (ll i = 0; i < n; i++)
{
cin >> a[i];
}
sort(a, a + n);
ll ans = 1;
for (ll i = 0; i < n; i++)
{
ans = ans * (a[i] - i) % mod;
}
cout << ans << endl;
}