2017ACM暑期多校联合训练 - Team 7 1002 HDU 6121 Build a tree (深搜+思维)
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 (深搜+思维)的更多相关文章
- 2017ACM暑期多校联合训练 - Team 8 1002 HDU 6134 Battlestation Operational (数论 莫比乌斯反演)
题目链接 Problem Description The Death Star, known officially as the DS-1 Orbital Battle Station, also k ...
- 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) , ...
- 2017ACM暑期多校联合训练 - Team 1 1002 HDU 6034 Balala Power! (字符串处理)
题目链接 Problem Description Talented Mr.Tang has n strings consisting of only lower case characters. He ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)
题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...
- 2017ACM暑期多校联合训练 - Team 8 1008 HDU 6140 Hybrid Crystals (模拟)
题目链接 Problem Description Kyber crystals, also called the living crystal or simply the kyber, and kno ...
随机推荐
- SSM整合CRUD操作(一)
http://www.cnblogs.com/loger1995/p/6352179.html?utm_source=itdadao&utm_medium=referral 说明:这是我刚开始 ...
- 【C++】指针和引用
引用: 引用(reference)是为对象起了另外一个名字,引用类型应用(refers to)另外一种类型.通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名. 一般初始化变量时, ...
- iOS OC语言原生开发的IM模块--RChat
iOS OC语言原生开发的IM模块,用于项目中需要原生开发IM的情况,具备发送文字.表情.语音.图片.视频等完整功能,包含图片预览视频播放等功能,此项目将会长期更新如有问题可以提出,我的邮箱:fshm ...
- PHP安装扩展mcrypt以及相关依赖项 【PHP安装PECL扩展的方法】
一:Mcrypt简介 Mcrypt是PHP的一个扩展,完成了常用加密算法的封装.其实该扩展是对mcrypt标准类库的封装,mcrypt完成了相当多的常用加密算法,如DES, TripleDES, Bl ...
- Zookeeper(三) Zookeeper原理与应用
一.zookeeper原理解析 1.进群角色描述 2.Paxos 算法概述( ZAB 协议) 分布式一致性算法 3.Zookeeper 的选主(恢复模式) 以一个简单的例子来说明整个选举的过程. ...
- 2656: [Zjoi2012]数列(sequence)(递归+高精度)
好久没写题了T T NOIP 期中考双血崩 显然f(x)=f(x>>1)+f((x>>1)+1),考虑每次往x>>1递归,求出f(x),复杂度O(logN) 我们设 ...
- kill -9 a postgres process
在postgresql中,不推荐使用Kill -9直接杀掉异常连接,因为直接使用kill -9会引起整个数据库核心进程的重启,同时其他正常程序连接也会被杀掉. 现开启两个psql连接,然后使用Kill ...
- Codeforces Round #410 (Div. 2)A B C D 暴力 暴力 思路 姿势/随机
A. Mike and palindrome time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- 洛谷P1012 拼数
题目描述 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213 又如:n=4时,4个整数7,13,4 ...
- JSP2 的自定义标签
在 JSP 中开发标签库只需如下几个步骤 1.开发自定义标签处理类 2.建立一个 *.tld 文件,每个 *.tld 文件对应一个标签库,每个标签库可包含多个标签 3.在 JSP 文件中使用自定义标签 ...