算法
(排列组合、排序) $O(n\log n)$
$A_i \ne A_j (1 \leqslant i < j \leqslant N)$ 意味着数列 $A$ 中的每个元素都不一样
可以先把数列 $C$ 按从小到大的顺序排序,对于每个 $A_i$ 可以取 $C_i - i + 1$ 个数,然后利用乘法原理把每个数的取值个数乘起来即可。
C++ 代码
#include <bits/stdc++.h>
#include <atcoder/all>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using std::cin;
using std::cout;
using std::max;
using std::vector;
using namespace atcoder;
using ll = long long;
using mint = modint1000000007;
int main() {
int n;
cin >> n;
vector<int> c(n);
rep(i, n) cin >> c[i];
sort(c.begin(), c.end());
mint ans = 1;
rep(i, n) {
ans *= max(c[i] - i, 0);
}
cout << ans.val() << '\n';
return 0;
}