题目链接: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叉树,思维的更多相关文章

  1. 2017多校第9场 HDU 6161 Big binary tree 思维,类似字典树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6161 题意: 题目是给一棵完全二叉树,从上到下从左到右给每个节点标号,每个点有权值,初始权值为其标号, ...

  2. 2017多校第8场 HDU 6138 Fleet of the Eternal Throne 思维,暴力

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6138 题意:给了初始区间[-1,1],然后有一些操作,可以r加上一个数,l减掉一个数,或者同时操作,问 ...

  3. 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− ...

  4. HDU 6121 Build a tree(完全K叉树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6121 题意:给你一颗完全K叉树,求出每棵子树的节点个数的异或和. 思路: 首先需要了解一些关于完全K叉树或满K叉 ...

  5. HDU 6121 Build a tree(k叉树的子树大小相异)

    http://acm.hdu.edu.cn/showproblem.php?pid=6121 题目大意: 给你一颗 n 个节点的完全 k 叉树,问你这棵树中所有子树结点个数的总异或值. 分析: 我们很 ...

  6. HDU 6121 Build a tree(找规律+模拟)

    Build a tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)To ...

  7. 2017多校第9场 HDU 6170 Two strings DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6170 题意:给了2个字符串,其中第2个字符串包含.和*两种特别字符,问第二个字符串能否和第一个匹配. ...

  8. 2017多校第9场 HDU 6169 Senior PanⅡ 数论,DP,爆搜

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6169 题意:给了区间L,R,求[L,R]区间所有满足其最小质数因子为k的数的和. 解法: 我看了这篇b ...

  9. 2017多校第10场 HDU 6181 Two Paths 次短路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6181 题意:给一个图,求出次短路. 解法:我之前的模板不能解决这种图,就是最短路和次短路相等的情况,证 ...

随机推荐

  1. 认识MEAN开发框架[转]

    MEAN是一个Javascript平台的现代Web开发框架总称,它是MongoDB + Express +AngularJS + NodeJS 四个框架的第一个字母组合. MongoDB是一个使用JS ...

  2. 理清一下JavaScript面向对象思路

    借这篇文章理清一下自己的思路,同时也希望能给和我同样一知半解的同学理清一下思路.引发思考来自于我犯的一个错误,错误代码是这样的: 1 var o = { 2     ... 3 } 4 var obj ...

  3. Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) A B 水 搜索

    A. Oath of the Night's Watch time limit per test 2 seconds memory limit per test 256 megabytes input ...

  4. 洛谷P3935 Calculating (莫比乌斯反演)

    P3935 Calculating 题目描述 若xx分解质因数结果为\(x=p_1^{k_1}p_2^{k_2}\cdots p_n^{k_n},令f(x)=(k_1+1)(k_2+1)\cdots ...

  5. uva 11424

    uva 11424 GCD - Extreme (I) 题意:思路:(见http://www.cnblogs.com/Duahanlang/p/3184994.html ) 差别在于数据规模和时间,其 ...

  6. 由一篇博文做出的代码,不用Math.round()如何实现其功能

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  7. 【updating】python读书笔记-The Django Book2.0(for django1.4)

    原文:http://www.djangobook.com/en/2.0/frontmatter.html 译文:http://djangobook.py3k.cn/2.0/ 或者http://docs ...

  8. oracle to_char格式数值

    C:\Users\XXX>sqlplus / as sysdba SQL :: Copyright (c) , , Oracle. All Rights Reserved. 连接到: Oracl ...

  9. Java中JAVA_HOME与CLASSPATH的解析(转)

    很多人在初学Java的时候经常会被书中介绍的一堆环境变量的设置搞得头昏脑胀,很多书中都会在初装JDK的时候让他大家设置JAVA_HOME环境变量,在开发程序的时候设置CLASSPATH环境变量,而很多 ...

  10. struts2之OGNL用法

    浅析OGNL OGNL是Object-GraphNavigation Language的缩写,是一种功能强大的表达式语言 通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对 ...