Submission #1302976

#TimeUsernameProblemLanguageResultExecution timeMemory
1302976duckindogAnagramistica (COCI21_anagramistica)C++20
110 / 110
7 ms5696 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 2000 + 10,
            M = 1'000'000'007;
int n, k;
string s[N];

inline void add(auto& x, const auto& y) {
    x += y;
    if (x >= M) x -= M;
}
inline int powder(int a, int b) {
    int ret = 1;
    for (; b; b /= 2, a = 1ll * a * a % M) {
        if (b & 1) ret = 1ll * ret * a % M;
    }
    return ret;
}

int fac[N], ifac[N];
inline int C(int n, int k) { return 1ll * fac[n] * ifac[n - k] % M * ifac[k] % M; }

int f[N][N];

int32_t main() {
    cin.tie(0)->sync_with_stdio(0);

    if (fopen("input.txt", "r")) {
        freopen("input.txt", "r", stdin);
        freopen("output.txt", "w", stdout);
    }
    if (fopen("anagramistica.inp", "r")) {
        freopen("anagramistica.inp", "r", stdin);
        freopen("anagramistica.out", "w", stdout);
    }

    cin >> n >> k;
    for (int i = 1; i <= n; ++i) cin >> s[i];

    for (int i = 1; i <= n; ++i) {
        sort(s[i].begin(), s[i].end());
    }
    sort(s + 1, s + n + 1);

    vector<int> vt;
    { // cal vt
        string last;
        for (int i = 1; i <= n; ++i) {
            if (s[i] != last) last = s[i], vt.push_back(0);
            vt.back() += 1;
        }
    }

    { // init fact
        fac[0] = 1;
        for (int i = 1; i < N; ++i) fac[i] = 1ll * fac[i - 1] * i % M;
        ifac[N - 1] = powder(fac[N - 1], M - 2);
        for (int i = N - 1; i >= 1; --i) ifac[i - 1] = 1ll * ifac[i] * i % M;
    }

    vt.insert(vt.begin(), 0);

    f[0][0] = 1;
    for (int i = 1; i < (int)vt.size(); ++i) {
        for (int j = 0; j <= k; ++j) {
            auto& ret = f[i][j];
            for (int choose = 0; choose <= vt[i]; ++choose) {
                int pii = choose * (choose - 1) / 2;
                if (pii > j) break;
                add(ret, 1ll * f[i - 1][j - pii] * C(vt[i], choose) % M);
            }
        }
    }

    cout << f[vt.size() - 1][k] << "\n";
}

Compilation message (stderr)

anagramistica.cpp: In function 'int32_t main()':
anagramistica.cpp:31:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   31 |         freopen("input.txt", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
anagramistica.cpp:32:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   32 |         freopen("output.txt", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
anagramistica.cpp:35:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   35 |         freopen("anagramistica.inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
anagramistica.cpp:36:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   36 |         freopen("anagramistica.out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...