Submission #949138

#TimeUsernameProblemLanguageResultExecution timeMemory
949138shezittAnagramistica (COCI21_anagramistica)C++14
110 / 110
7 ms1996 KiB
#include <bits/stdc++.h> using namespace std; #define endl '\n' #define sz(x) (int)x.size() #define dbg(x) cerr << #x << ": " << x << endl; using ll = long long; #define int ll const int MOD = 1e9+7; const int N = 2005; int bpow(int a, int b){ int r = 1; while(b){ if(b&1){ r = r * a % MOD; } a = a * a % MOD; b /= 2; } return r; } int inv(int x){ return bpow(x, MOD-2); } int fact[N]; int invfact[N]; void init(){ fact[0] = 1; invfact[0] = inv(fact[0]); for(int i=1; i<N; ++i){ fact[i] = fact[i-1] * i % MOD; invfact[i] = inv(fact[i]); } } int nck(int n, int k){ if(k > n) return 0; int res = fact[n] * invfact[n-k] % MOD * invfact[k] % MOD; return res; } signed main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); init(); int n, k; cin >> n >> k; vector<string> s(n); vector<int> comp; for(int i=0; i<n; ++i){ cin >> s[i]; sort(s[i].begin(), s[i].end()); } sort(s.begin(), s.end()); int cur = 1; for(int i=1; i<n; ++i){ if(s[i] != s[i-1]){ // new comp.push_back(cur); cur = 1; } else { cur++; } } comp.push_back(cur); int m = sz(comp); vector<vector<int>> dp(m+1, vector<int>(k+1, 0)); dp[0][0] = 1; for(int i=0; i<m; ++i){ for(int j=0; j<=k; ++j){ for(int tam=0; tam <= comp[i]; ++tam){ int tmp = nck(tam, 2); if(j + tmp > k) break; int &res = dp[i+1][j + tmp]; res = (res + (dp[i][j] * nck(comp[i], tam) % MOD)) % MOD; } } } cout << dp[m][k]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...