Cod sursa(job #1503715)

Utilizator elevenstrArina Raileanu elevenstr Data 16 octombrie 2015 19:53:32
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;
#define MOD 30011
#define MAX 107
ifstream in("iepuri.in");
ofstream out("iepuri.out");
vector <int> v[MAX];
vector <int> a;
int mat[MAX][MAX];
bitset <MAX> viz;
int k;
int f[MAX];
int maxi[MAX];
inline void build(int nod,int dist)
{
    viz[nod]=1;
    for(vector<int> ::iterator it=v[nod].begin(); it!=v[nod].end(); it++)
    {
        if(!viz[*it])build(*it,dist+1);
        maxi[nod]=max(maxi[nod],maxi[*it]+1);
    }
    if(v[nod].size()==0)
    {
        maxi[nod]=0;
        for(int j=dist; j<=k; j++)
        {
            mat[nod][j]=1;
        }
        return;
    }
    int l;


    int prod=1,sum=0;

    for(int j=dist; j<=k-maxi[nod]; j++) //3 la 4
    {
        prod=1;
        for(vector<int> ::iterator it=v[nod].begin(); it!=v[nod].end(); ++it)
        {
            //9 si 8
            sum=0;
            for( l=j+1; l<=k-maxi[*it]; l++)
            {
                sum=(sum+mat[*it][l]%MOD)%MOD;

            }
            prod=(prod*sum%MOD)%MOD;

        }
        mat[nod][j]=prod%MOD;
    }


}

int main()
{
    int n,x,y,i,j;
    in>>n>>k;
    for(i=1; i<=n-1; i++)
    {
        in>>x>>y;
        v[x].push_back(y);
        f[y]++;
    }
    int nan;
    for(i=1; i<=n; i++)
        if(f[i]==0)nan=i;
    build(nan,1);

    int s=0;
    for(i=1; i<=k; i++)
        s=(s+mat[nan][i]%MOD)%MOD;
    out<<s%MOD;


    return 0;
}