一些计数题
Posted hfctf0210
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一些计数题相关的知识,希望对你有一定的参考价值。
可能是血(水)考前最后一篇题解了,不过还是写写题解吧。
大部分来源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);
以上是关于一些计数题的主要内容,如果未能解决你的问题,请参考以下文章