D 宝石装箱
1 #include<bits/stdc++.h> 2 #define int long long 3 using namespace std; 4 const int N = 8e3 + 10; 5 const int mod = 998244353; 6 int a[N] , fac[N] , dp[N]; 7 void init() 8 { 9 fac[0] = 1; 10 for(int i = 1 ; i <= N - 10 ; i ++) fac[i] = fac[i - 1] * i % mod; 11 } 12 signed main() 13 { 14 ios::sync_with_stdio(false); 15 init(); 16 int n , m = 0; 17 cin >> n; 18 for(int i = 1 ; i <= n ; i ++) 19 { 20 int x; 21 cin >> x; 22 a[x] ++ ; 23 } 24 dp[0] = 1; 25 for(int i = 1 ; i <= n ; i ++) 26 for(int j = i ; j >= 1 ; j --) 27 dp[j] += dp[j - 1] * a[i] , dp[j] %= mod; 28 int ans = 0; 29 for(int i = 0 ; i <= n ; i ++) 30 { 31 if(i & 1) ans -= dp[i] * fac[n - i] ; 32 else ans += dp[i] * fac[n - i]; 33 ans = (ans + mod) % mod; 34 } 35 cout << ans << '\n'; 36 return 0; 37 }