제출 #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...