1 条题解

  • 0
    @ 2026-9-22 1:08:24

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,mod;
    vector<int>t1[3005];
    vector<int>t2[3005];
    int dp[3005][3005][3];
    long long ans;
    
    int getid(int u,int v)
    {
    	int dk=0;
    	for(int x:t1[u])
    	{
    		if(v==x)
    		{
    			return dk;
    		}
    		dk++;
    	}
    	return -1;
    }
    
    void dfs(int u,int fa)
    {
    	int son1=0,son2=0,cnt=0;
    	for(int v:t2[u])
    	{
    		if(v==fa)
    		{
    			continue;
    		}
    		dfs(v,u);
    		if(!cnt)
    		{
    			son1=v;
    			cnt=1;
    		}
    		else
    		{
    			son2=v;
    			cnt++;
    		}
    	}
    
    	for(int x=1;x<=n;x++)
    	{
    		for(int i=0;i<(int)t1[x].size();i++)
    		{
    			int a=0,b=0,tot=0;
    			for(int y:t1[x])
    			{
    				if(y==t1[x][i])
    				{
    					continue;
    				}
    				if(tot==0)
    				{
    					a=y;
    				}
    				else
    				{
    					b=y;
    				}
    				tot++;
    			}
    
    			if(tot==0)
    			{
    				dp[u][x][i]=1%mod;
    			}
    			else if(tot==1)
    			{
    				int ia=getid(a,x);
    				if(cnt>=1)
    				{
    					dp[u][x][i]+=dp[son1][a][ia];
    				}
    				if(cnt>=2)
    				{
    					dp[u][x][i]+=dp[son2][a][ia];
    				}
    				dp[u][x][i]%=mod;
    			}
    			else
    			{
    				if(cnt<2)
    				{
    					dp[u][x][i]=0;
    				}
    				else
    				{
    					int ia=getid(a,x);
    					int ib=getid(b,x);
    					dp[u][x][i]+=(long long)dp[son1][a][ia]*dp[son2][b][ib]%mod;
    					dp[u][x][i]+=(long long)dp[son2][a][ia]*dp[son1][b][ib]%mod;
    					dp[u][x][i]%=mod;
    				}
    			}
    		}
    	}
    
    	// 枚举x映射到u,并且u是整个映射中最高点的方案数
    	for(int x=1;x<=n;x++)
    	{
    		int d=t1[x].size();
    		if(d==0)
    		{
    			ans+=1%mod;
    		}
    		else if(d==1)
    		{
    			int a=t1[x][0];
    			int ia=getid(a,x);
    			if(cnt>=1)
    			{
    				ans+=dp[son1][a][ia];
    			}
    			if(cnt>=2)
    			{
    				ans+=dp[son2][a][ia];
    			}
    			ans%=mod;
    		}
    		else if(d==2&&cnt==2)
    		{
    			int a=t1[x][0];
    			int b=t1[x][1];
    			int ia=getid(a,x);
    			int ib=getid(b,x);
    			ans+=(long long)dp[son1][a][ia]*dp[son2][b][ib]%mod;
    			ans+=(long long)dp[son2][a][ia]*dp[son1][b][ib]%mod;
    			ans%=mod;
    		}
    	}
    }
    
    int main()
    {
    	scanf("%d%d%d",&n,&m,&mod);
    	for(int i=1;i<n;i++)
    	{
    		int u,v;
    		scanf("%d%d",&u,&v);
    		t1[u].push_back(v);
    		t1[v].push_back(u);
    	}
    	for(int i=1;i<m;i++)
    	{
    		int u,v;
    		scanf("%d%d",&u,&v);
    		t2[u].push_back(v);
    		t2[v].push_back(u);
    	}
    
    	int rt=1;
    	while(rt<=m&&(int)t2[rt].size()>1)
    	{
    		rt++;
    	}
    
    	dfs(rt,0);
    	printf("%lld",ans%mod);
    }
    
    
    • 1

    信息

    ID
    3373
    时间
    3000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    4
    已通过
    1
    上传者