一些计数题

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

大部分来源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);
}

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

时间: 2024-10-12 02:20:25

一些计数题的相关文章

ZJU校赛 一道计数题

题意是这样的 给定一个n*m的整数矩阵 n和m均小于1000 对这个矩阵删去任意行和列后剩余一个矩阵为M{x1,x2,,,,xm;y1,y2,,,,,yn}表示删除任意的M行N列 对于这个剩下的矩阵,我们考虑其中是否存在特殊的元素,保证这些元素是所在行最大,所在列最小的元素 且非之一. 求对于所有删法,上述元素个数之和 对10^9+7取余. 显然所有删法 有2^(n+m)种 暴力是搞不定的. 于是反过来看,矩阵的元素最多有10^6个 是不是可以考虑每一个元素对最终答案的贡献? 所谓贡献,就是它在

hdu-6415 Rikka with Nash Equilibrium dp计数题

http://acm.hdu.edu.cn/showproblem.php?pid=6415 题意:将1~n*m填入一个n*m矩阵 问只有一个顶点的构造方案. 顶点的定义是:某数同时是本行本列的最大值. 题解:考虑最大的那个数,必然是顶点.然后再考虑第二大的,它只能填在上一个数所在的行列.通过这个填法,成果摸出了第一个样例.但完全不会写程序(要分类,递归完全不会写). 后来知道是个O(n*n*m*m)的dp(搜索)orz 直播里的转移方程和代码:dp[i][j][k]代表填了i个数,j行k列已经

Codeforces/TopCoder/ProjectEuler 散题笔记 (持续更新)

最近做到了一些有趣的散题,于是开个Blog记录一下吧- (如果有人想做这些题的话还是不要看题解吧-) 2017-03-16 PE 202 Laserbeam 题意:有一个正三角形的镜子屋,光线从$C$点射入,求恰好反射$12017639147$次后在$C$点射出的方案数. 题解:关于反射问题容易想到对称性,不断对称翻转正三角形,可以密铺整个平面,这样一条反射$k$次的路径对应平面上经过$k$条边的路径. 然后取$CB,CA$为基,把平面画正,就能得到一个带有平行的对角线的网格图,稍微观察一下就能

[ACM] POJ 2409 Let it Bead (Polya计数)

Let it Bead Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4434   Accepted: 2916 Description "Let it Bead" company is located upstairs at 700 Cannery Row in Monterey, CA. As you can deduce from the company name, their business is b

第十六周 Leetcode 600. Non-negative Integers without Consecutive Ones(HARD) 计数dp

Leetcode600 很简单的一道计数题 给定整数n 求不大于n的正整数中 二进制表示没有连续的1的数字个数 在dp过程中只要保证不出现连续1以及大于n的情况即可. 所以设计按位dp[i][j]表示到第i位 j=0表示第i位为0 且值等于n的情况 2为值小于n的情况 j=1表示第i位为1 且值等于n的情况 3为值小于n的情况 转移方程很简单 看代码吧 这道题应该是Mid难度吧 class Solution { public: int findIntegers(int num) { int va

待 题表

题表 达哥终极杂题表Bzoj2839 hdu6021 Codeforces 804DBzoj2248 hdu5575 Codeforces 786CBzoj2013 bzoj2676 Codeforces 803CBzoj2386 bzoj3782 Codeforces 813DBzoj2699 cogs1667 Codeforces 814DBzoj4798 bzoj2064 Codeforces 814EBzoj4639 bzoj3505 Codeforces 815ABzoj4417 bz

noi.ac #45 计数

\(des\) 给定 \(n\) 的全排列 + 一个值域属于 \([1, n]\) 的元素构成长度为 \(n + 1\) 的序列 问长度为 \(i\) 的本质不同的子序列的个数 \(sol\) 小学计数题 记 \(p + 1, q - 1\) 的元素相同 从起点到第一个相同元素长度 \(p\) 从终点到第二个相同元素长度 \(q\) 对于长度为 \(i\) 的本质不同的子序列的个数 可以用全部的答案 - 出现重复的个数 显然全部的答案 \(n + 1 \choose i\) 对于重复的答案,只存

Atcoder AGC031B Reversi (DP计数)

简单的计数题.(总算做出一道AGC的B题了,然而这场比赛我忘记打了233333) 题目链接: https://atcoder.jp/contests/agc031/tasks/agc031_b 题意: 有一个长度为\(N\)的颜色序列,第\(i\)个位置初始颜色为\(a_i\), 可以执行若干次操作,每次可以选择两个颜色一样的位置,然后把这两个位置中间的区间都刷成和两端相同的颜色,问最后本质不同的序列有多少种. 题解: 最重要的想法就是要深刻地理解本质不同. 因为我们不论如何操作,最后得到的序列

计数训练之一

https://www.luogu.org/problem/P2606 不知道为什么这道题在数位dp里 分析:又是一个与排列有关的计数题, P(i)>P(i/2)这个条件很重要啊 也有**P(2*i)>P(i)**, 也有**P(2*i+1)>P(i)** 像这种下标二倍的关系就要和二叉树考虑在一起 二叉树:i的左儿子就是2i,i的右儿子就是2i+1 而且这颗二叉树是个完全二叉树 首先计算出i个节点的完全二叉树中, 根节点的左子树包含的节点数l,右子树包含的节点数r. 首先,根节点的值必