刚学oi 1 ms萌新在线求调
查看原帖
刚学oi 1 ms萌新在线求调
1088663
zzzyyyyhhhhh楼主2024/6/17 21:26

第一遍自己写的 10pts

这一遍和的题解,但还是10 pts,且和第一遍正确性无区别

#include"bits/stdc++.h"
// #define int long long
typedef long long ll;
using namespace std;
const ll N=1e5+100,mod=1e9+7;
int n,k;
vector<int> a[N];
int siz[N];
int d[N][109][2][2];//是否放置,是否标记
int t[109][2][2];
int add(int x,ll y)
{
	y%=mod;
	y+=x;
	y%=mod;
	return y;
}
void dfs(int x,int f)
{
	siz[x]=d[x][0][0][0]=d[x][1][1][0]=1;
	for(auto v:a[x])
	{
		if(v==f)continue;
		dfs(v,x);
		for(int i=0;i<=siz[x]&&i<=k;i++)
		{
			t[i][0][0]=d[x][i][0][0],d[x][i][0][0]=0;
			t[i][0][1]=d[x][i][0][1],d[x][i][0][1]=0;
			t[i][1][0]=d[x][i][1][0],d[x][i][1][0]=0;
			t[i][1][1]=d[x][i][1][1],d[x][i][1][1]=0;
		}

		for(int i=0;i<=siz[x]&&i<=k;i++)
		{
			for(int j=0;j<=siz[i]&&j+i<=k;j++)
			{
				d[x][i+j][0][0]=add(d[x][i+j][0][0],1ll*t[i][0][0]*d[v][j][0][1]);

				d[x][i+j][0][1]=add(d[x][i+j][0][1],1ll*t[i][0][1]*(d[v][j][0][1]+d[v][j][1][1]));
				d[x][i+j][0][1]=add(d[x][i+j][0][1],1ll*t[i][0][0]*d[v][j][1][1]);

				d[x][i+j][1][0]=add(d[x][i+j][1][0],1ll*t[i][1][0]*(d[v][j][0][0]+d[v][j][0][1]));

				d[x][i+j][1][1]=add(d[x][i+j][1][1],1ll*t[i][1][0]*(d[v][j][1][0]+d[v][j][1][1]));
				d[x][i+j][1][1]=add(d[x][i+j][1][1],1ll*t[i][1][1]*(1ll*d[v][j][0][0]+d[v][j][0][1]+d[v][j][1][0]+d[v][j][1][1]));
			}
		}
		siz[x]+=siz[v];
	}
}
signed main()
{
	cin>>n>>k;
	int x,y;
	for(int i=1;i<n;i++)
	{
		cin>>x>>y;
		a[x].push_back(y);
		a[y].push_back(x);
	}
	dfs(1,0);
	cout<<(1ll*d[1][k][0][1]+d[1][k][1][1])%mod;
}
2024/6/17 21:26
加载中...