救命,第四个点T了,好像是输出的锅
查看原帖
救命,第四个点T了,好像是输出的锅
56739
Soknock楼主2020/10/7 22:06

RT 前面dfs卡时测试了一遍,发现好像是后面输出的锅

不懂 求教QAQ

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>

#define N 150005
#define MOD 1000000007
#define ull long long
#define rg register
using namespace std;
int n,k,x,y,siz[N],timeblock;
int dp[N][105][2][2],g[N][105][2];
vector<int>e[N];

inline int tmod(ull a,ull b){
	ull x=a%MOD,y=b%MOD;
	return (int)(x+y)%MOD;
}

void dfs(int u,int fa){
	siz[u]=1;
	for(vector<int>::iterator a=e[u].begin();a!=e[u].end();a++){
		int v=*a;
		if(v==fa)continue;
		dfs(v,u);
		siz[u]+=siz[v];
		for(rg int a=0;a<=min(siz[u],k);a++){
			g[a][0][0]=dp[u][a][0][0]%MOD;dp[u][a][0][0]=0;
			g[a][0][1]=dp[u][a][0][1]%MOD;dp[u][a][0][1]=0;
			g[a][1][1]=dp[u][a][1][1]%MOD;dp[u][a][1][1]=0;
			g[a][1][0]=dp[u][a][1][0]%MOD;dp[u][a][1][0]=0;
		}
		for(rg int a=0;a<=min(k,siz[u]);a++){
			for(rg int b=0;b<=min(k-a,siz[v]);b++){
				dp[u][a+b][0][0]=tmod(dp[u][a+b][0][0],(ull)dp[v][b][0][1]*(ull)g[a][0][0]);
				dp[u][a+b][1][0]=tmod(dp[u][a+b][1][0],(ull)g[a][1][0]*((ull)dp[v][b][0][0]+(ull)dp[v][b][0][1]));
				dp[u][a+b][0][1]=tmod(dp[u][a+b][0][1],(ull)g[a][0][1]*((ull)dp[v][b][0][1]+(ull)dp[v][b][1][1]));
				dp[u][a+b][0][1]=tmod(dp[u][a+b][0][1],(ull)g[a][0][0]*(ull)dp[v][b][1][1]);
				dp[u][a+b][1][1]=tmod(dp[u][a+b][1][1],(ull)g[a][1][0]*((ull)dp[v][b][1][0]+(ull)dp[v][b][1][1]));
				dp[u][a+b][1][1]=tmod(dp[u][a+b][1][1],(ull)g[a][1][1]*((ull)dp[v][b][0][0]+(ull)dp[v][b][0][1]+(ull)dp[v][b][1][1]+(ull)dp[v][b][1][0]));
			}
		}
	}
}
int main(){
	scanf("%d%d",&n,&k);
	for(rg int a=1;a<=n-1;a++){
		scanf("%d%d",&x,&y);
		e[x].push_back(y);
		e[y].push_back(x);
	}
	for(rg int a=1;a<=n;a++)
		dp[a][0][0][0]=dp[a][1][1][0]=1;
	dfs(1,-1);
	cout<<(dp[1][k][0][1]+dp[1][k][1][1])%MOD;
	return 0;
}
2020/10/7 22:06
加载中...