제출 #1331835

#제출 시각아이디문제언어결과실행 시간메모리
1331835ahmetlbktd4Anagramistica (COCI21_anagramistica)C++20
0 / 110
7 ms15940 KiB
#include "bits/stdc++.h"
#define ff first
#define ss second
#define ll long long
using namespace std;

const int N = 2e3+3;
const int mod = 1e9+7;

ll f[N],in[N];
int dp[N][N];
vector <int> a;
int n,k;

int pw(int a,int b){
    if (!b)
    return 1;
    ll h = pw(a,b/2);
    if (b&1)
    h = (h*a)%mod;
    return (h*h)%mod;
}

int C(int n,int k){
    return f[n] * in[k]%mod * in[n-k]%mod;
}

int coz(int m,int k){
    int &h = dp[m][k];
    if (~h)
    return h;
    if (!m){
        if (!k)
        h = 1;
        else h = 0;
        return h;
    }
    h = 0;
    for (int i = 0;i <= a[m-1];i++){
        if (i*(i-1)/2 > k)
        break;
        h = (h+(C(a[m-1],i)*coz(m-1,k-i*(i-1)/2))%mod)%mod;
    } 
    return h;
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    for (int i = 0;i < N;i++){
        fill(dp[i],dp[i]+N,-1);
    }
    f[0] = 1;
    for (int i = 1;i < N;i++){
        f[i] = (f[i-1]*i)%mod;
    }
    in[N-1] = pw(f[N-1],mod-2);
    for (int i = N-2;i >= 0;i--){
        in[i] = (in[i+1]*(i+1))%mod;
    }
    cin >> n >> k;
    map <string,int> mp; 
    for (int i = 0;i < n;i++){
        string s;
        cin >> s;
        sort(s.begin(),s.end());
        mp[s]++;
    }
    int m = 0;
    for (auto i : mp){
        a.push_back(i.ss);
        m++;
    }
    // dp[0][0] = 1;
    // for (int i = 1;i <= m;i++){
    //     for (int j = 0;j <= k;j++){
    //         for (int h = 0;h <= a[i-1];h++){
    //             if (h*(h-1)/2 > j)
    //             break;
    //             dp[i][j] = (dp[i][j] + C(a[i-1],h)*dp[i-1][j-h*(h-1)/2])%mod;
    //         }
    //     }
    // }
    cout << coz(m,k) << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...