#include <bits/stdc++.h>
#define all(v) v.begin(), v.end()
#define int long long
using namespace std;
const int sz = 2e3 + 2, mod = 1e9 + 7;
int n, k, f[sz], inv[sz];
string s;
vector<int> cur, prv;
map<string, int> mp;
int bp(int a, int b, int r = 1)
{
while(b > 0)
{
if(b & 1) r = r * a % mod;
a = a * a % mod;
b >>= 1;
}
return r;
}
int C(int n, int k)
{
if(n < k) return 0;
return f[n] * inv[k] % mod * inv[n - k] % mod;
}
void solve()
{
cin >> n >> k;
prv.resize(k + 1, 0);
cur.resize(k + 1, 0);
for(int i = 1; i <= n; i++)
{
cin >> s;
sort(all(s));
mp[s]++;
}
prv[0] = 1;
for(auto p : mp)
{
int freq = p.second;
for(int i = 0; i * (i - 1) <= freq * (freq - 1); i++)
{
int pairs = i * (i - 1) / 2;
for(int j = pairs; j <= k; j++)
{
cur[j] += prv[j - pairs] * C(freq, i) % mod;
cur[j] %= mod;
}
}
prv = cur;
fill(all(cur), 0);
}
cout << prv[k];
}
signed main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
inv[0] = f[0] = 1;
for(int i = 1; i < sz; i++)
{
f[i] = f[i - 1] * i % mod;
inv[i] = bp(f[i], mod - 2);
}
int t = 1;
// cin >> t;
while(t--) solve();
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |