题目链接

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. [2017BUAA软工]第三次博客作业:案例分析

    第三次博客作业:案例分析 1. 调研和评测 1.1 BUG及设计缺陷描述 主要测试博客园在手机端上的使用情况. [BUG 01] 不能后退到上一界面(IOS) 重现步骤:打开博客首页中任意博文,点击博 ...

  2. gearman参数说明

    -b, –backlog=BACKLOG 连接请求队列的最大值 -d, –daemon Daemon 守护进程化 -f, –file-descriptors=FDS 可打开的文件描述符数量 -h, – ...

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

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

  4. jQuery数据表格控件boostrap-table

    表格初始化js代码 function TableInit() { $("#edit").attr({"disabled":"disabled" ...

  5. BZOJ3875 AHOI2014/JSOI2014骑士游戏(动态规划)

    容易想到设f[i]为杀死i号怪物所消耗的最小体力值,由后继节点更新.然而这显然是有后效性的,正常的dp没法做. 虽然spfa已经死了,但确实还是挺有意思的.只需要用spfa来更新dp值就可以了.dij ...

  6. C++解析(9):关于const和引用的疑问

    0.目录 1.关于const的疑问 2.关于引用的疑问 2.1 引用与指针 2.2 从C++语言与C++编译器角度看引用 2.3 从工程项目开发看引用 3.小结 1.关于const的疑问 const什 ...

  7. P2756 飞行员配对方案问题(网络流24题之一)

    题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外 ...

  8. 考研路茫茫――单词情结 HDU - 2243(ac自动机 + 矩阵快速幂)

    考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. DjangoORM基本增删改查

    1. 下载并且安装navicat premium,连接到db.sqlite3数据库. 2.先在urls.py中增加一条对应关系,专门用来做测试. 3.此时models.py中的代码如下: 4. 对于O ...

  10. 【ZJOI2005】沼泽鳄鱼 题解报告

    题目描述 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客. 为了让游玩更有情趣,人们在池塘的中央建设了几座石墩和石桥 ...