# 145. 数组子序列的排列 每个元素出现的次数相乘就可以了。 注意 “长度为 m 的数组,1 到 m 每个元素都出现过,且恰好出现 1 次。” ,题目中有n个元素,所以我们要统计的就是 1 到 n 元素出现的个数。 因为如果有一个元素x 大于n了, 那不可能出现 长度为x的数组 且 1 到 x 每个元素都出现过。 ```CPP #include "bits/stdc++.h" using namespace std; int main(){ int n; int x; cin >> n; unordered_map umap; for(int i = 0; i < n; ++i){ cin >> x; if(umap.find(x) != umap.end()) umap[x]++; else umap[x] = 1; } long long res = 0; long long num = 1; for (int i = 1; i <= n; i++) { if (umap.find(i) == umap.end()) break; // 如果i都没出现,后面得数也不能 1 到 m 每个元素都出现过 num = (num * umap[i]) % 1000000007; res += num; res %= 1000000007; } cout << res << endl; } ``` ```Java import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); Map map = new HashMap<>(); for (int i = 0; i < n; i++) { int x = sc.nextInt(); map.put(x, map.getOrDefault(x, 0) + 1); } long res = 0; long num = 1; for (int i = 1; i <= n; i++) { if (!map.containsKey(i)) break; // 如果i都没出现,后面得数也不能1到m每个元素都出现过 num = (num * map.get(i)) % 1000000007; res += num; res %= 1000000007; } System.out.println(res); sc.close(); } } ``` ```python def main(): import sys input = sys.stdin.read data = input().split() n = int(data[0]) umap = {} for i in range(1, n + 1): x = int(data[i]) if x in umap: umap[x] += 1 else: umap[x] = 1 res = 0 num = 1 MOD = 1000000007 for i in range(1, n + 1): if i not in umap: break # 如果i都没出现,后面得数也不能1到m每个元素都出现过 num = (num * umap[i]) % MOD res = (res + num) % MOD print(res) if __name__ == "__main__": main() ```