Cod sursa(job #1568546)

Utilizator DobosDobos Paul Dobos Data 14 ianuarie 2016 13:50:20
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin ("iepuri2.in");
ofstream fout("iepuri2.out");
const int NMAX = 105;
const int MOD = 30011;
const int INF = 1e9;
vector < int > G[NMAX],Gf[NMAX];
int D[NMAX][NMAX],V[NMAX];
void calcul(const int &nod){
    int s,p,ok;
    for(int i = 1; i <= V[nod]; i++){
       s = 0;
       ok = 1;
       for(int j = 1; ok != 0; j++){
            p = 1;
            ok = 0;
            for(int k = 0; k < G[nod].size();k++){
                if(D[j][G[nod][k]] != 0){
                    p = (p*D[j][G[nod][k]])%MOD;
                    ok = 1;
                }
            if(ok != 0)
                s = (s + p)%MOD;
            }
       }
       D[i][nod] = s;
    }

}

void vodka(const int &nod,const int &k){
    if(G[nod].size() == 0){
        if(k - V[nod] + 1 < 0)
            D[1][nod] = 0;
        else
            D[1][nod] = k - V[nod] + 1;
        for(int i = 2;i <= D[1][nod];i++){
            D[i][nod] = D[i-1][nod];
        }
        V[nod] = D[1][nod];
        return;
    }
    int mn = INF;
    for(int i = 0; i < G[nod].size(); i++){
        V[G[nod][i]] = V[nod] + 1;
        vodka(G[nod][i],k);
        if(V[G[nod][i]] < mn)
            mn = V[G[nod][i]];
    }
    V[nod] = mn;
    calcul(nod);
}
 main()
{
    int n,k,x,y;
    fin >> n >> k;
    for(int i = 1; i < n; i++){
        fin >> x >> y;
        G[x].push_back(y);
        Gf[y].push_back(x);
    }
    for(int i = 1; i <= n; i++){
        if(Gf[i].size() == 0)
            x = i;
    }
    vodka(x,k);
    int s,i = 0;
    for(int i = 1; i <= V[x];i++)
        s = (s + D[i][x])%MOD;
    fout << s;
    return 0;
    }