#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |