码迷,mamicode.com
首页 > 其他好文 > 详细

一些计数题

时间:2019-06-17 01:00:03      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:gif   alt   连通块   style   pre   sed   cli   col   for   

可能是血(水)考前最后一篇题解了,不过还是写写题解吧。

大部分来源51nod

51nod1253 Kundu and Tree

挺思博的一道题。首先黑色边没用,所以可以把其视为连通块,然后走出该连通块必然要经过至少一条红色边,于是就是总方案数减3个全在一个黑连通块再减去2个在一个黑连通块。

技术图片
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e4+7,mod=1e9+7;
int n,ans,fa[N],sz[N];
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
int C3(int x){return x<3?0:1ll*x*(x-1)*(x-2)/6%mod;}
int C2(int x){return x<2?0:1ll*x*(x-1)/2%mod;}
int main()
{
    scanf("%d",&n);
    if(n<3){puts("0");return 0;}
    for(int i=1;i<=n;i++)fa[i]=i;
    for(int i=1,x,y;i<n;i++)
    {
        char op;scanf("%d%d %c",&x,&y,&op);
        if(op==b)x=find(x),y=find(y),fa[x]=y;
    }
    for(int i=1;i<=n;i++)sz[find(i)]++;
    ans=C3(n);
    for(int i=1;i<=n;i++)ans=(ans-C3(sz[i])-1ll*C2(sz[i])*(n-sz[i])%mod+2*mod)%mod;
    printf("%d",ans);
}
View Code

 

一些计数题

标签:gif   alt   连通块   style   pre   sed   cli   col   for   

原文地址:https://www.cnblogs.com/hfctf0210/p/11037393.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!