题目链接

Problem Description

HazelFan wants to build a rooted tree. The tree has n nodes labeled 0 to n−1, and the father of the node labeled i is the node labeled ⌊i−1k⌋. HazelFan wonders the size of every subtree, and you just need to tell him the XOR value of these answers.

Input

The first line contains a positive integer T(1≤T≤5), denoting the number of test cases.

For each test case:

A single line contains two positive integers n,k(1≤n,k≤1018).

Output

For each test case:

A single line contains a nonnegative integer, denoting the answer.

Sample Input

2

5 2

5 3

Sample Output

7

6

题意:

有一个由n个节点(编号为0~n-1)构成的完全k次树,节点i的父节点的编号为 ⌊(i−1)/k⌋。求出所有的节点大小的异或值。

分析:

因为这是一棵完全k次树,我们手下可以确定的一点就是如果这是一棵满k次树,那么所有的叶子节点都在最后一层,否则除最后一层不满外,倒数第二成还有一部分的叶子结点,也就是说所有叶子结点的高度差最多为1,而且最后一层的叶子结点还全部在左边,倒数第二成的叶子结点全部在右边.

还可以发现或许会存在(如果存在的话仅有一个)有一个节点有子节点,但是子节点的个数又不是k,我们称这个节点为残缺节点。

最后一层的残缺节点肯定就是最后一个节点,我们可以发现该层上它左边节点的大小全部为1,右边全部为0,在往上递归回溯的时候,这时当前节点子树的大小特殊,其左边的所有同层次节点子树大小相同,其右边的所有同层次节点子树大小相同,所以对于每一层只需要考虑三种不同的节点子树大小以及个数。

具体的解释参考代码,注释很详细。

代码:

#include <iostream>
#include <stdio.h>
using namespace std;
typedef long long LL;
const LL N=1e18+5;
LL cnt[70];///每一层的残缺节点所在的地方
LL pw[70];///每一层的所有的节点的个数
int deep;
LL n,k,m,ans,L,R,mid; void dfs(int x)
{
/*
L:左兄弟节点往下的所有节点的个数
R:右兄弟节点往下的所有节点的个数
mid:残缺节点往下的所有的节点的个数
*/
if(x>deep) return ;
dfs(x+1);
LL pos=(cnt[x]-1)%k; ///pos表示的是于那个残缺节点同父节点的左边的兄弟节点个数 int f=(cnt[x]-1)&1;///左边的兄弟节点个数的奇偶性,奇数才异或一次
if(f) ans^=L; f=(pw[x]-cnt[x])&1;///同理右边的子树个数的奇偶性
if(f) ans^=R; ans^=mid; mid=pos*L+mid+1+(k-pos-1)*R;
L=L*k+1;///左边一个子树上的节点个数
R=R*k+1;///右边一个子树上的节点个数
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld",&n,&k);
if(k == 1)///为1的情况单独考虑
{
if(n%4 == 0) ans = n;
else if(n%4 == 1) ans = 1;
else if(n%4 == 2) ans = n+1;
else if(n%4 == 3) ans = 0;
printf("%lld\n",ans);
continue;
}
LL tmp=1;
m=n-1;
pw[0]=1;///pw表示的是每一层的节点个数
for(int i=1; i<70; i++)
{
tmp=tmp*k;
pw[i]=tmp;
if(m<tmp || tmp<0 )
{
pw[i]=N;
deep=i;
break;
}
m-=tmp;
}
cnt[deep]=m;///最后一层不满有m个
if(m==0)///最后一层为0个的话,相当于上一层正好铺满往上移一层
{
deep--;
m=cnt[deep]=pw[deep];
}
///之后的每一层
for(int i=deep-1; i>=0; i--)
{
cnt[i]=(m+k-1)/k;
m=cnt[i];
}
L=1;
mid=1;
R=0;
ans=0;
dfs(0);
printf("%lld\n",ans);
}
return 0;
}

2017ACM暑期多校联合训练 - Team 7 1002 HDU 6121 Build a tree (深搜+思维)的更多相关文章

  1. 2017ACM暑期多校联合训练 - Team 8 1002 HDU 6134 Battlestation Operational (数论 莫比乌斯反演)

    题目链接 Problem Description The Death Star, known officially as the DS-1 Orbital Battle Station, also k ...

  2. 2017ACM暑期多校联合训练 - Team 6 1002 HDU 6097 Mindis (数学)

    题目链接 Problem Description The center coordinate of the circle C is O, the coordinate of O is (0,0) , ...

  3. 2017ACM暑期多校联合训练 - Team 1 1002 HDU 6034 Balala Power! (字符串处理)

    题目链接 Problem Description Talented Mr.Tang has n strings consisting of only lower case characters. He ...

  4. 2017ACM暑期多校联合训练 - Team 4 1004 HDU 6070 Dirt Ratio (线段树)

    题目链接 Problem Description In ACM/ICPC contest, the ''Dirt Ratio'' of a team is calculated in the foll ...

  5. 2017ACM暑期多校联合训练 - Team 9 1005 HDU 6165 FFF at Valentine (dfs)

    题目链接 Problem Description At Valentine's eve, Shylock and Lucar were enjoying their time as any other ...

  6. 2017ACM暑期多校联合训练 - Team 9 1010 HDU 6170 Two strings (dp)

    题目链接 Problem Description Giving two strings and you should judge if they are matched. The first stri ...

  7. 2017ACM暑期多校联合训练 - Team 8 1006 HDU 6138 Fleet of the Eternal Throne (字符串处理 AC自动机)

    题目链接 Problem Description The Eternal Fleet was built many centuries ago before the time of Valkorion ...

  8. 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)

    题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...

  9. 2017ACM暑期多校联合训练 - Team 8 1008 HDU 6140 Hybrid Crystals (模拟)

    题目链接 Problem Description Kyber crystals, also called the living crystal or simply the kyber, and kno ...

随机推荐

  1. 2nd 历年学生作品评论(3部)

    历年学生作品评论(3部) 1.基于GUI的图书管理系统 利用NABCD模型进行竞争性需求分析:http://www.cnblogs.com/chitty/p/4546876.html 测试说明书: h ...

  2. 用到的C++标准库

    std::set<type>, 模板写的平衡二叉树的集合容器, method: insert, count, std:map<int, string>, 映射和多重映射基于某一 ...

  3. laravel5.6 调用第三方类库

    大概流程: 1. 新建一个目录方类库 2. 配置composer配置文件 3. 在项目中使用终端运行composer  dumpautoload 4. 使用时 方法调用可以new对象后->方法名 ...

  4. 转载:java程序调用内存的变化过程

    前文知道了java程序运行时在内存中的大概分布,但是对于具体程序是如何运行的,看到一篇文章,直接转载过来. (一)不含静态变量的java程序运行时内存变化过程分析 代码: package oop; / ...

  5. C 语言疑难杂症 [转:http://blog.chinaunix.net/uid-20688544-id-1894880.html]

    无聊在网上找了些C语言的东东练一下手,竟然发现其实还有好多细节之前,没注意到,该好好复习一下先. 解决掉的问题先不发出来,把疑问的先做个笔记,过几天解决了就回来修改补上.   #include < ...

  6. 第164天:js方法调用的四种模式

    js方法调用的四种模式 1.方法调用模式 function Persion() { var name1 = "itcast", age1 = 19, show1 = functio ...

  7. bzip2 --安装

    下载源文件安装包: http://www.bzip.org/downloads.html 解压: tar -xzvf bzip2-1.0.6.tar.gz 进入解压后的目录: cd bzip2-1.0 ...

  8. 专题训练之区间DP

    例题:以下例题部分的内容来自https://blog.csdn.net/my_sunshine26/article/details/77141398 一.石子合并问题 1.(NYOJ737)http: ...

  9. PID控制算法的C语言实现七 梯形积分的PID控制算法C语言实现

    在PID控制律中积分项的作用是消除余差,为了减小余差,应提高积分项的运算精度,为此,可将矩形积分改为梯形积分. 梯形积分的计算公式为: pid.voltage=pid.Kp*pid.err+index ...

  10. laravel5.1 eloquent with 通过闭包筛选特定 field 得不到结果的问题

    (图片有点大,可右键新tab查看) User模型 class User extends Model { public function profile() { return $this->has ...