Pagini recente » Cod sursa (job #2598875) | Cod sursa (job #2204739) | Cod sursa (job #1802747) | Cod sursa (job #1912608) | Cod sursa (job #2396415)
#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;
}