警示后人
查看原帖
警示后人
606278
封禁用户楼主2024/5/4 12:42
// 1<=n<=1e5 0<=k<=n 1<=x,y<=n x!=y 1<=b<=N	1<=c<=3
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=1e5+5,mod=1e9+7;

int col[MAXN],dp[MAXN][5];
vector<int> e[MAXN];

void dfs(int id,int pre){
	if (col[id]==0){
		dp[id][1]=dp[id][2]=dp[id][3]=1;
		for (int i:e[id]){
			if (i==pre) continue;
			dfs(i,id);
			dp[id][1]*=(dp[i][2]+dp[i][3])%mod;
			dp[id][1]%=mod;

			dp[id][2]*=(dp[i][1]+dp[i][3])%mod;
			dp[id][2]%=mod;

			dp[id][3]*=(dp[i][1]+dp[i][2])%mod;
			dp[id][3]%=mod;
		}
	}
	else{
		dp[id][col[id]]=1;
		for (int i:e[id]){
			if (i==pre) continue;
			dfs(i,id);
			int tmp=dp[i][1]+dp[i][2]+dp[i][3];
			dp[id][col[id]]*=(tmp-dp[i][col[id]])%mod;
			dp[id][col[id]]%=mod;
		}
	}
}

signed main(){
	int n,k;
	scanf("%lld %lld",&n,&k);
	for (int i=1;i<n;i++){
		int u,v;
		scanf("%lld %lld",&u,&v);
		e[u].push_back(v);
		e[v].push_back(u);
	}
	for (int i=1;i<=k;i++){
		int u,v;
		scanf("%lld %lld",&u,&v);
		col[u]=v;
	}
	dfs(1,-1);
	printf("%lld",(dp[1][1]+dp[1][2]+dp[1][3])%mod);

	return 0;
}

第31行运算完不能取模,否则可能减出负数!输出要取模!

2024/5/4 12:42
加载中...