hdu 6121 Build a tree

2023-11-14

Problem

acm.hdu.edu.cn/showproblem.php?pid=6121

Meaning

一棵 n 个点的完全 k 叉树,结点标号从 0 到 n - 1,求以每一棵子树的大小的异或和。

Analysis

一层层地统计答案。
tree
找到一个特殊点:n - 1。以从它到树根的路径上的每一个点 p 为界,把树在该层的点劈成两半:左边是满 k 叉树的树根,右边是比左边的少了一层的满 k 叉树的树根,都很好算。
而 p 为根的子树,叶子层有可能是残缺的,除了叶子层外,也是一棵满 k 叉树。只要找到以 p 为根的子树中最左下角的后代结点编号,用 n - 1 一减,就得出子树 p 的叶子数。
要特判 k = 1 退化成链的情况(谜之打表找规律),照做应该会超时?
要注意各种爆 long long,比如:最后一层单独做、换乘法为除法…

Code

#include <cstdio>
using namespace std;
const int N = 1000000;

long long fast_pow(long long a, int b)
{
    long long res = 1;
    for( ; b; b >>= 1, a *= a)
        if(b & 1)
            res *= a;
    return res;
}

// 满 k 叉树,前 n 层总结点数
long long nNode(long long k, int n)
{
    return (fast_pow(k, n) - 1) / (k - 1);
}

long long table[100];

// table[i] = 满 k 叉树前 i 层总结点数
// 减少 nNode() 的调用(快速幂的次数)
// 虽然后来发现超时的原因并不在这
void da_biao(long long k, int d)
{
    for(int i = 0; i <= d; ++i)
        table[i] = nNode(k, i);
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        long long n, k, ans = 0;
        scanf("%I64d%I64d", &n, &k);
        // 特判 k = 1
        if(k == 1)
        {
            int rest = n & 3; // n % 4
            if(!rest)
                ans = n;
            else if(rest == 1)
                ans = 1;
            else if(rest == 2)
                ans = n + 1;
            else
                ans = 0;
            printf("%I64d\n", ans);
            continue;
        }
        // 求树的高度
        // 根的高度设为 1
        int depth = 1;
        for(long long m = n - 1; m > 0; ++depth)
            m = (m - 1) / k;

        da_biao(k, depth + 2);

        // 整棵树
        ans = n;
        // 最底层单独做
        ans ^= (n - table[depth - 1]) & 1;

        --depth;
        long long p = (n - 2) / k; // [(n - 1) - 1] / k,倒数第 2 层开始
        long long lid, rid, lnum, rnum, lch;
        for(int d = 2; p > 0; p = (p - 1) / k, ++d, --depth)
        {
            // 当前层最左边结点的标号
            lid = table[depth - 1];
            // 当前层最右边结点的标号
            rid = table[depth] - 1;
            // 左边的子树(满的)的大小
            lnum = table[d];
            // 右边的子树(少一层,但也是满的)的大小
            rnum = table[d - 1];

            if((p - lid) & 1)
                ans ^= lnum;
            if((rid - p) & 1)
                ans ^= rnum;

            lch = p; // p 为根的子数最左小角的后代结点
            while(lch <= (n - 2) / k) // lch * k + 1 <= n - 1
                lch = lch * k + 1;
            ans ^= table[d - 1] + n - lch;
        }
        printf("%I64d\n", ans);
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hdu 6121 Build a tree 的相关文章

  • Volatile.Read 和 Volatile.Write 背后的逻辑是什么?

    来自 MSDN Volatile Read 读取字段的值 在需要它的系统上 插入一个 阻止处理器重新排序内存的内存屏障 操作如下 如果在该方法之后出现读或写 代码 处理器无法移动它before这个方法 and Volatile Write
  • IEnumerable 的 String.Join(string, string[]) 的类似物

    class String包含非常有用的方法 String Join string string 它从数组创建一个字符串 用给定的符号分隔数组的每个元素 但一般来说 它不会在最后一个元素之后添加分隔符 我将它用于 ASP NET 编码 以用
  • 我如何知道 C 程序的可执行文件是在前台还是后台运行?

    在我的 C 程序中 我想知道我的可执行文件是否像这样在前台运行 a out 或者像这样 a out 如果你是前台工作 getpgrp tcgetpgrp STDOUT FILENO or STDIN FILENO or STDERR FIL
  • 在 ASP.NET MVC 中将模型从视图传递到控制器

    我正在 ASP NET MVC 中开发我的第一个应用程序 但遇到了一个我无法解决的问题 即使在阅读了整个互联网之后也是如此 因此 我有几个使用视图模型创建的视图 它们是报告 这些视图模型是根据用户选择标准填充的 我正在尝试构建一种接受模型并
  • C# 处理标准输入

    我目前正在尝试通过命令行断开与网络文件夹的连接 并使用以下代码 System Diagnostics Process process2 new System Diagnostics Process System Diagnostics Pr
  • 将下拉列表与字典绑定

    我将字典绑定到下拉列表 举例来说 我的字典中有以下项目 Test1 123 Test2 321 我希望下拉文本采用以下格式 Test1 Count 123 Test2 Count 321 我沿着以下路径走 但没有运气 MyDropDown
  • 将日期时间转换为指定格式

    我有这个日期格式yy MM dd HH mm ss ex 12 02 21 10 56 09 问题是 当我尝试使用以下代码将其转换为不同格式时 CDate 12 02 21 10 56 09 ToString MMM dd yyyy HH
  • 用于连接 DataTable 上的动态列的动态 LINQ

    我目前遇到的情况不确定如何继续 我有两个从数据库填充的数据表 我还有一个可用的列名称列表 可用于将这两个数据表连接在一起 我希望编写一组 LINQ 查询 这些查询将 显示两个数据表中的行 内部联接 用于从一个数据表更新另一个数据表 显示一个
  • Resharper:IEnumerable 的可能多重枚举

    我正在使用新的 Resharper 版本 6 在我的代码中的几个地方 它给一些文本加了下划线 并警告我可能存在IEnumerable 可能的多重枚举 我理解这意味着什么 并在适当的情况下采纳了建议 但在某些情况下 我不确定这实际上是一个大问
  • 使用 OleDbCommandBuilder 时访问 SQL 语法错误

    我要在 C 中使用 OleDbDataAdapter 在 Access 数据库中插入数据 但收到错误消息INSERT INTO 命令中的语法错误 BackgroundWorker worker new BackgroundWorker Ol
  • C++ 到 C# 事件处理

    所以我有我的C WinForm 应用程序 我从中调用我的C CLI MFC dll图书馆 但也有一些events在我的 C 库上 甚至此事件也发生在该库的本机 非 CLI 部分 我需要从我的 C 应用程序调用一些代码 并获取一些有关此事件的
  • 使用多线程进行矩阵乘法?

    我应该使用线程将两个矩阵相乘 有两件事 当我运行程序时 我不断得到 0 我还收到消息错误 对于每个错误 它在粗体行上显示 警告 从不兼容的指针类型传递 printMatrix 的参数1 我尝试打印输出 还要注意 第一个粗体块 这是我解决问题
  • 无法在 C# 中为 EventArgs 分配使用派生类型的事件处理程序

    所以我有一个事件声明如下 public event EventHandler OnChangeDetected 然后我有以下处理程序被分配给该事件 myObject OnChangeDetected OnTableChanged 我的理解是
  • 在哪里可以下载没有 Visual Studio 2010 的 C# 4.0 编译器?

    我知道 CTP VS 2010 映像 但我可以只下载 NET Framework 4 0 和 C 编译器吗 AFAIK VS 2010 CTP 仅作为 VM 映像提供 我不相信 Microsoft 发布了 VS 的安装程序 其中一个绝对不适
  • C 语言中的 Alpha 混合 2 RGBA 颜色[重复]

    这个问题在这里已经有答案了 可能的重复 如何快速进行阿尔法混合 https stackoverflow com questions 1102692 how to do alpha blend fast 对 2 个 RGBA 整数 颜色进行
  • 如果“嵌入式”SQL 2008 数据库文件不存在,如何创建它?

    我使用 C ADO Net 和在 Server Management Studio 中创建的嵌入式 MS SQL 2008 数据库文件 附加到 MS SQL 2008 Express 创建了一个数据库应用程序 有人可以向我指出一个资源 该资
  • 将 Swagger 与命名空间版本的 WebApi 结合使用

    我已经找到了如何使用基于名称空间的 WebAPI 版本这个班 https aspnet codeplex com SourceControl changeset view dd207952fa86 Samples WebApi Namesp
  • 如何在c linux中收听特定接口上的广播?

    我目前可以通过执行以下操作来收听我编写的简单广播服务器 仅广播 hello int fd socket PF INET SOCK DGRAM 0 struct sockaddr in addr memset addr 0 sizeof ad
  • 为什么表达式 a = a + b - ( b = a ) 在 C++ 中给出序列点警告?

    以下是测试代码 int main int a 3 int b 4 a a b b a cout lt lt a lt lt a lt lt lt lt b lt lt b lt lt n return 0 编译此命令会出现以下警告 gt g
  • 嵌入式二进制资源 - 如何枚举嵌入的图像文件?

    我按照中的说明进行操作这本书 http www apress com book view 9781430225492 关于资源等的章节 我不太明白的是 如何替换它 images Add new BitmapImage new Uri Ima

随机推荐

  • 9.调试技巧与调试工具

    9
  • Unix网络编程5种IO模型

    IO模型 用一幅图表示所支持的I O模型 纵向维度是 阻塞 Blocking 非阻塞 Non blocking 横向维度是 同步 异步 总结起来是四种模型 同步阻塞 同步非阻塞 异步阻塞 异步非阻塞 Unix网络编程 中划分出了 第五种 模
  • mysql数据库入门教程

    Markdown database notebook Markdown database notebook 1 1 Mysql知识 基础 1 1 1 Msyql的基本知识 1 2 Mysql知识 深入 1 2 1 Mysql的储存引擎 1
  • DIV与Table布局在大型网站的可用性比较

    DIV与TABLE本身并不存在什么优缺点 所谓web标准只是推荐的是正确的使用标签 好比说 DIV用于布局 而TABLE则本来就是转二维数据的 让TABLE做该做的事 并不是说页面里不出现TABLE就是多么多么牛 用DIV进行排版的优势就是
  • jQuery-migrate 插件---各类版本下载

    步骤 1 CDN jquery migrate 2 找到所需版本打开 3 全选复制到自己创建的记事本 4 复制 5 粘贴到IntelliJ IDEA 模块下的 webapp js 没有自己手动创建目录 jquery migrate 1 4
  • Oracal的Lpad函数

    lpad函数是Oracle数据库函数 lpad函数从左边对字符串使用指定的字符进行填充 从其字面意思也可以理解 l是left的简写 pad是填充的意思 所以lpad就是从左边填充的意思 语法格式如下 lpad string padded l
  • unity笔记-20161109

    1 Animator CullingMode 动画器剔除模式 AlwaysAnimate Always animate the entire character Object is animated even when offscreen
  • 在Python中如何优雅地处理PDF文件

    1 引言 PDF文档是我们在日常工作中经常会遇到的文件格式 有时我们需要编辑并从中提取一些有用的数据 在本文中 我将向大家介绍如何使用Python中的PDF库从PDF文档中提取文本 表格和图像以及其他类型的数据 闲话少说 我们直接开始吧 2
  • JS实现请假时长计算(计算小时数差)

    给公司做了一套系统 涉及到请假单功能开发 在计算请假时长这块总结一下 按天计算的就不总结了比较简单 这里总结一下按小时数计算的 话不多说 直接上代码 获取两个日期相差的工作小时 不包括节假日 function getHour StartTi
  • Python 中的异常种类

    常用异常 AttributeError 试图访问一个对象没有的树形 比如foo x 但是foo没有属性x IOError 输入 输出异常 基本上是无法打开文件 ImportError 无法引入模块或包 基本上是路径问题或名称错误 Inden
  • Matlab quiver函数用法 - 画矢量箭头图

    提要 quiver x y u v 在点 x y 处画 u v 所定义的向量箭头 x y u v必须是维度和元素数都一样的矩阵 如果是一维数组的话 x y u v的元素数必须一致 quiver函数会自动调整箭头的长度以适应显示 quiver
  • iOS静态方式绕过svc反动态调试

    在iOS反动态调试中 常用到 svc 0x80 通过svc汇编实现对ptrace syscall的调用 实现反动态调试 使得lldb无法附加到app进程 不易定位到代码位置 增加反调试绕过难度 如何绕过这种反调试手段呢 本文通过搜索app的
  • ajax请求发送成功,后端没有响应

    前端请求状态200 但是后端无反应结果是以为我的登录拦截器把这个请求拦截了 登录之后就发现后端有响应了 2021 4 1日常错误
  • Python自学笔记2-语法

    这里介绍Python的基本语法和编程风格 Python的保留字 如下表 不能以这些名字给函数或变量命名 and exec not assert finally or break for pass class from print conti
  • UE5 C++插件开发指南目录

    这一篇原本的标题是 如何将插件上架到UE虚幻商城 但是Up主聆枫LingFeng已经分享了相关议题 而且非常详细 UE 虚幻商城上架指南 所以这一篇就改写目录了 其实由谁来讲并不重要 重要的是讲的内容是否是读者需要的 希望大家可以从中受益
  • SQL练习(less-5\8)延时注入

    本文为学习笔记 仅限学习交流 不得利用 从事危害国家或人民安全 荣誉和利益等活动 SQL注入 字符型 延时注入 延时型语句 sleep 参数 任意正整数 一般为秒 If a b c 它的意思就是如果条件A成立 则输出结果B 否则输出结果C
  • HTML 好看界面

    无聊逛外网的时候 突然看见一个用HTML写的界面 我觉得挺好看 对于我这个才接触这个的学生来说 挺厉害的 所以我也把他分享出来 你们可以去参考参考
  • 第50讲:Scrapy 部署不用愁,Scrapyd 的原理和使用

    上节课我们的分布式爬虫部署完成并可以成功运行了 但是有个环节非常烦琐 那就是代码部署 我们设想下面的几个场景 如果采用上传文件的方式部署代码 我们首先需要将代码压缩 然后采用 SFTP 或 FTP 的方式将文件上传到服务器 之后再连接服务器
  • linux磁盘分区以及配置文件设置

    硬盘分区有三种 主磁盘分区 83 扩展磁盘分区 5 逻辑分区 包括swap交换分区82 一个硬盘主分区至少有1个 最多4个 扩展分区可以没有 最多1个 且主分区 扩展分区总共不能超过4个 逻辑分区可以有若干个 交换分区必须存在但一般不用 补
  • hdu 6121 Build a tree

    Problem acm hdu edu cn showproblem php pid 6121 Meaning 一棵 n 个点的完全 k 叉树 结点标号从 0 到 n 1 求以每一棵子树的大小的异或和 Analysis 一层层地统计答案 找