2017多校第7场 HDU 6121 Build a tree K叉树,思维
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6121
题意:一个n个点的完全k叉树,求每个节点的size的异或和。
解法:容易发现,考虑根的所有孩子,最多只有一个不是满k叉树,我们只要把这个子节点作为临界点,其左边的就是满k叉树,其右边的便是比左边层数小一的满k叉树,那么我们每次只要算出中间这个非满k叉树的节点个数即可,然后对这个孩子进行递归处理。而其他子树由于是满k叉树,其数量可以提前预处理出来。这样处理在k>2的时候复杂度是logk(n)的,但是当k等于1时速度很慢会T,所以直接特判k=1的情况。
//HDU 6121
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n, k, ans, num[105];
LL qsm(LL a, LL n){
LL ret=1;
while(n){
if(n&1) ret=ret*a;
a=a*a;
n>>=1;
}
return ret;
}
void init(LL k, LL dep)
{
for(int i=1; i<=dep; i++){
num[i] = (qsm(k,i)-1)/(k-1);
}
}
int main()
{
int T;
scanf("%d", &T);
//freopen("1.in","r",stdin);
while(T--)
{
scanf("%lld%lld", &n,&k);
if(k == 1){
LL temp=n%4;
if(temp==0) printf("%lld\n", n);
else if(temp==1) printf("%lld\n",1LL);
else if(temp==2) printf("%lld\n", n+1);
else printf("%lld\n", 0LL);
continue;
}
int dep = 1;//树高
LL res=n-1;
while(res){
res=(res-1)/k;
dep++;
}
init(k,dep);
ans = n; //根节点为0的子树
ans ^= (n-num[dep-1])&1;//最后一层有多少个节点
dep--;
LL pos=(n-1-1)/k;//临界点在当前层标号为pos的子树上
int now = 2;//从下往上第几层,最后一层已经处理了
while(dep>1){
LL left=num[dep-1];//当前层最左边节点的编号
LL right=num[dep]-1;//当前层最右边的节点的编号
LL temp1=num[now];//当前层满k叉树的子节点个数
LL temp2=num[now-1];//当前层满k叉数层数减1后的子节点个数
if((pos-left)&1){
ans^=temp1;
}
if((right-pos)&1){
ans^=temp2;
}
LL cnt=pos;
while(cnt<=(n-1-1)/k){//cnt*k+1<=n-1会爆long long
cnt=cnt*k+1;
}
ans ^= num[now-1]+n-cnt;//当前点的子树特殊处理
now++;
dep--;
pos=(pos-1)/k;
}
printf("%lld\n", ans);
}
return 0;
}
2017多校第7场 HDU 6121 Build a tree K叉树,思维的更多相关文章
- 2017多校第9场 HDU 6161 Big binary tree 思维,类似字典树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6161 题意: 题目是给一棵完全二叉树,从上到下从左到右给每个节点标号,每个点有权值,初始权值为其标号, ...
- 2017多校第8场 HDU 6138 Fleet of the Eternal Throne 思维,暴力
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6138 题意:给了初始区间[-1,1],然后有一些操作,可以r加上一个数,l减掉一个数,或者同时操作,问 ...
- 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− ...
- HDU 6121 Build a tree(完全K叉树)
http://acm.hdu.edu.cn/showproblem.php?pid=6121 题意:给你一颗完全K叉树,求出每棵子树的节点个数的异或和. 思路: 首先需要了解一些关于完全K叉树或满K叉 ...
- HDU 6121 Build a tree(k叉树的子树大小相异)
http://acm.hdu.edu.cn/showproblem.php?pid=6121 题目大意: 给你一颗 n 个节点的完全 k 叉树,问你这棵树中所有子树结点个数的总异或值. 分析: 我们很 ...
- HDU 6121 Build a tree(找规律+模拟)
Build a tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)To ...
- 2017多校第9场 HDU 6170 Two strings DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6170 题意:给了2个字符串,其中第2个字符串包含.和*两种特别字符,问第二个字符串能否和第一个匹配. ...
- 2017多校第9场 HDU 6169 Senior PanⅡ 数论,DP,爆搜
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6169 题意:给了区间L,R,求[L,R]区间所有满足其最小质数因子为k的数的和. 解法: 我看了这篇b ...
- 2017多校第10场 HDU 6181 Two Paths 次短路
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6181 题意:给一个图,求出次短路. 解法:我之前的模板不能解决这种图,就是最短路和次短路相等的情况,证 ...
随机推荐
- Select-poll-epoll-简介
1. Python的select()方法直接调用操作系统的IO接口,它监控sockets,open files, and pipes(所有带fileno()方法的文件句柄)何时变成readable 和 ...
- 1923: [Sdoi2010]外星千足虫
1923: [Sdoi2010]外星千足虫 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1254 Solved: 799[Submit][Statu ...
- 【BZOJ5329】【SDOI2018】战略游戏(圆方树,虚树)
[BZOJ5329][SDOI2018]战略游戏(圆方树,虚树) 题面 BZOJ 洛谷 Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战 ...
- POJ3335:Rotating Scoreboard——题解
http://poj.org/problem?id=3335 题目大意:给按照顺时针序的多边形顶点,问其是否有内核. —————————————————————————————— 看了两个小时的资料, ...
- BZOJ2697 特技飞行 【贪心】
题目链接 BZOJ2697 题解 好水好水的贪心... 容易发现每种特技只表演两次,多表演没有意义,而且差距越长收益越大 然后就可以贪,最大的放两端,次大的往里,然后是第三大....... 证明很简单 ...
- cloneNode与事件拷贝
用法: var newNode = oldNode.cloneNode(deep); //deep,布尔值,若为true,则克隆oldNode及其子节点,否则只克隆oldNode本身 关于复制事件 1 ...
- bzoj1004: [HNOI2008]Cards(burnside引理+DP)
题目大意:3种颜色,每种染si个,有m个置换,求所有本质不同的染色方案数. 置换群的burnside引理,还有个Pólya过几天再看看... burnside引理:有m个置换k种颜色,所有本质不同的染 ...
- 【DP优化】【P1430】序列取数
传送门 Description 给定一个长为n的整数序列,由A和B轮流取数(A先取).每个人可从序列的左端或右端取若干个数(至少一个),但不能两端都取.所有数都被取走后,两人分别统计所取数的和作为各自 ...
- shell中的颜色显示
By francis_hao Sep 30,2017 图片来自参考[1] 其中,"033"是八进制数,其对应的asciima也就是ESC.后面的颜色格式为:[背景 ...
- uboot各文件及文件夹分析
1.配置编译 uboot的配置编译需要在linux原生文件夹下,因为在编译过程中会生成符号链接.在windows中不支持.配置方法是:首先cd进入uboot源码的根目录,然后在根目录下执行:make ...