제출 #1177731

#제출 시각아이디문제언어결과실행 시간메모리
1177731RandomUserAnagramistica (COCI21_anagramistica)C++20
110 / 110
16 ms3468 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int mod = 1e9 + 7; const int maxn = 1e5 + 5; ll exp(ll a, ll b) { ll ans = 1; while(b) { if(b & 1) ans = ans * a % mod; a = a * a % mod; b /= 2; } return ans; } ll fac[maxn], inv[maxn]; ll C(ll n, ll k) { return fac[n] * inv[k] % mod * inv[n-k] % mod; } signed main() { fac[0] = inv[0] = 1; for(int i=1; i<maxn; i++) { fac[i] = fac[i-1] * i % mod; inv[i] = exp(fac[i], mod - 2); } int n, k; cin >> n >> k; map<string, int> mp; for(int i=1; i<=n; i++) { string s; cin >> s; sort(s.begin(), s.end()); mp[s]++; } n = mp.size(); vector<int> a(n+1); int id = 1; for(auto [_, c] : mp) a[id++] = c; ll dp[n+1][k+1]; memset(dp, 0, sizeof(dp)); dp[0][0] = 1; for(int i=1; i<=n; i++) { for(int j=0; j<=k; j++) { dp[i][j] = dp[i-1][j]; for(int x=1; x*(x-1)/2<=j&&x<=a[i]; x++) { ll val = dp[i-1][j-x*(x-1)/2] * C(a[i], x) % mod; dp[i][j] = (dp[i][j] + val) % mod; } } } cout << dp[n][k] << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...