首页 > 其他分享 >浙江理工大学淘汰赛---猫猫序

浙江理工大学淘汰赛---猫猫序

时间:2023-02-27 00:33:32浏览次数:37  
标签:--- GCC 猫猫 back dfs optimize 淘汰赛 节点

题目描述
我们都知道
树的dfs序是一棵树从根节点出发,dfs遍历时依次经过的节点序列。
现在猫猫有一棵包含n个结点的有根树,结点从1~n编号,1号点为根节点。猫猫想让你告诉它,这棵树的dfs序有多少种。
由于答案很大,你需要对998244353取模。
输入
第一行一个正整数n(1≤n≤2×105)表示节点数。
接下来n-1行,每行两个整数u,v(1≤u,v≤2×105且u≠v)表示树上的一条边 (u,v)。
输出
输出一个整数,表示这棵树dfs序的个数。
样例输入 Copy
5
1 2
1 4
2 3
2 5
样例输出 Copy
4

如图 ,dfs序有[1,2,3,5,4],[1,2,5,3,4],[1,4,2,3,5],[1,4,2,5,3] 共4种。

对于树的dfs序列来说,他的dfs序总数等于他的每个子节点的dfs序相乘再乘他的子序列的全排列的个数(阶乘),所以可以用dfs从子节点往上求,递推出根节点的dfs序总数。

点击查看代码
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N = 2e5 + 10, mod = 998244353;
ll f[N], ans[N];
vector<int>g[N];
void init()
{
    f[0] = 1;
    for (int i = 1; i <= N; i++)
    {
        f[i] = i * f[i - 1] % mod;
    }
}//f代表阶乘
void dfs(int u, int fa)//fa标记父节点
{
    ans[u] = 1;//对于一个节点本身自己的(如果没有子节点)dfs序就是1;
    for (auto v : g[u])
    {
        if (v == fa)continue;//遍历到父节点就跳过
        dfs(v, u);//往下遍历,把u作为父节点
        ans[u] = ans[u] * ans[v] % mod;//更新a[u]
    }
    ans[u] = ans[u] * f[g[u].size() - 1] % mod;//乘子节点的全排列,但是g[u]中有一个是和父节点相连,故还需要-1
}
int main()
{
    int i, j, n;
    cin >> n;
    init();
    for (i = 1; i < n; i++)
    {
        int x, y;
        cin >> x >> y;
        g[x].push_back(y);
        g[y].push_back(x);//未知谁是父亲节点
    }
    g[1].push_back(-1);//因为1没有父节点,我们假设-1是他的父节点
    dfs(1, -1);
    cout << ans[1];
    return 0;
}

标签:---,GCC,猫猫,back,dfs,optimize,淘汰赛,节点
From: https://www.cnblogs.com/myy-zzb/p/17158315.html

相关文章

  • AMBA总线介绍-01
    AMBA总线介绍AMBA总线概述AHBAPB不同IP之间的互连系统总线简介系统芯片中各个模块之间需要有接口连接总线作为子系统之间共享的通信链路优点:成本低,方便易用(通用......
  • js-惰性函数
    1.需求:我们现在需要写一个foo函数,这个函数返回首次调用时的Date对象,注意是首次。使用场景:当我们每次都需要进行条件判断,其实只需要判断一次,接下来的使用方式都不会发......
  • x210-2023-02-26
    1、个人猜测可能出于成本的考虑,厂家在BV4S上使用的ddr2芯片由原来三星的K4T1G164QE更换成了现在SPECTEK的PD723-25,即PRN系列,具体查询可以从SPECTEKSUPPORT网站上获得,这里......
  • linux驱动移植-SPI驱动移植(OLED SSD1306)
    在之前Mini2440裸机开发之SPI(OLEDSSD1306)中我们介绍了关于OLEDSSD1306相关的知识,这里我们将会学习以内核驱动的方式去控制OLED。一、OLED128x64(SSD1306)1.1引脚说明当......
  • day03-面向对象高级3-内部类&枚举&泛型
    1,内部类回顾:之前学了类的四个成员,分别是成员变量,成员方法,代码块,构造器,现在这是第五个成员,内部类;前三个作了解,第四个重点学习。内部类的应用场景......
  • 数据结构(借鉴408)-高阶算法的应用
    数据结构高阶算法的应用算法分析和解题的一般套路算法解法暴力解:枚举解法可行解:目标解法最优解:缘分解法算法解题得分套路结构体定义算法思想和算法步骤......
  • 【PyQt5学习-03-】PyQt5 控件概念
    快速开发:先看控件的功能,再根据需要选学1、什么是控件程序界面上的元素各自独立一块矩形区域具有的功能接收用户输入用户点击显示内容放置其他控件先学......
  • java学习日记20230226-java环境搭建及运行机制
    JDK安装配置环境变量:当执行的程序在当前目录不存在时,windows去系统path环境变量里面进行查找,如果没有找到报错不存在该命令。我的电脑-属性-高级系统设置-......
  • Linux - yum 使用方法
    Centos和RedHat都使用yum做为它们的默认软件包管理器yumsearchnmap#搜索软件包yuminfonmap#显示这个软件包的详细信息yuminstall-ynmap#安装软件包,......
  • 文件的读写--C语言
    1、文件操作函数详解C语言中没有输入输出语句,所有的输入输出功能,都用ANSIC提供的一组标准库函数来实现。文件操作标准库函数有:(1)文件的打开:fopen():打开文件(2)文件的关闭:fc......