Cod sursa(job #2396415)

Utilizator triscacezarTrisca Vicol Cezar triscacezar Data 3 aprilie 2019 14:58:25
Problema Componente biconexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("radare.in");
ofstream g("radare.out");

const int mod=31333;

int n,p,i,j,x,y,k,val[3010],put2[3010],hait[3010],euler[3010],st[3010],dr[3010],dyn[3010][3510];
vector<int> v[3010];

void dfs(int poz,int tata)
{
    euler[++k]=poz;
    st[poz]=k;
    for(auto it:v[poz])
        if(it!=tata)
        {
            dfs(it,poz);
            hait[poz]+=hait[it];
        }
    hait[poz]++;
    dr[poz]=k;
}

inline int sum(int a,int b)
{
    return (a+b>=mod)?a+b-mod:a+b;
}

int main()
{
    f>>n>>p;
    for(i=1; i<n; i++)
    {
        f>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    put2[0]=1;
    for(i=1;i<=n;i++)
        put2[i]=sum(put2[i-1],put2[i-1]);
    for(i=1; i<=n; i++)
        f>>val[i];
    dfs(1,0);
//    for(i=1;i<=k;i++)
//        cout<<euler[i]<<' ';cout<<'\n';
//    for(i=1;i<=n;i++)
//        cout<<i<<": "<<st[i]<<' '<<dr[i]<<' '<<hait[i]<<'\n';
    dyn[0][0]=1;
    for(i=0;i<n;i++)
        for(j=0;j<=p;j++)
            if(dyn[i][j])
            {
                if(j+val[euler[i+1]]<=p)
                    dyn[i+1][j+val[euler[i+1]]]=sum(dyn[i+1][j+val[euler[i+1]]],dyn[i][j]);
                dyn[dr[euler[i+1]]][j]=(dyn[dr[euler[i+1]]][j]+dyn[i][j]*put2[hait[euler[i+1]]-1])%mod;
            }
    g<<dyn[n][p];
    return 0;
}