Cod sursa(job #2955190)

Utilizator Theodor17Pirnog Theodor Ioan Theodor17 Data 16 decembrie 2022 15:35:06
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
#include <bitset>
#include <vector>

using namespace std;

ifstream cin("iepuri.in");
ofstream cout("iepuri.out");

const int NMAX = 1e2;
const int MOD = 30011;

int dp[NMAX + 1][NMAX + 1], rad, n, k, a, b, ans;
vector <int> subordonati[NMAX + 1];
bitset <NMAX + 1> radacina, fr[NMAX + 1][NMAX + 1];

void dfs(int x, int morcovi){

    if(subordonati[x].empty()){

        for(int j = 1; j <= k; j++)
            dp[x][j] = 1;

        return;
    }

    dp[x][morcovi] = 1;

    for(auto y : subordonati[x]){

        int suma = 0;
        for(int j = morcovi + 1; j <= k; j++){

            if(fr[y][j] == 0){

                fr[y][j] = 1;
                dfs(y, j);

            }

            suma += dp[y][j];

        }

        suma %= MOD;
        dp[x][morcovi] *= suma;
        dp[x][morcovi] %= MOD;

    }

}

int main(){

    cin >> n >> k;
    for(int i = 0; i < n - 1; i++){

        cin >> a >> b;
        subordonati[a].push_back(b);

        radacina[b] = 1;
    }

    for(int i = 1; i <= n; i++)
        if(!radacina[i])
            rad = i;

    for(int morcovi = 1; morcovi <= k; morcovi++){


        dfs(rad, morcovi);

        ans += dp[rad][morcovi];
        ans %= MOD;

    }

    cout << ans;
    return 0;
}