/**
* 题意:一棵 n 个点的完全 k 叉树,结点标号从 0 到 n - 1,求以每一棵子树的大小的异或和。
* 解法:k叉树,当k=1时,特判,用xorn函数,具体解释:http://blog.csdn.net/a3630623/article/details/12371727
* k不等一1;我们dfs求解,当是满k叉树,可以很快求的;每层最对可能三类树,少一层的满k叉树,
* 少两层的满k叉树,不满的子树dfs求解。
*/
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cmath>
#include <set>
#include <map>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef long long LL;
const int INF=2e9+1e8; const int MOD=1e9+7;
const double eps=0.0000000001;
void fre()
{
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
}
#define MSET(a,b) memset(a,b,sizeof(a)) const int maxn=1e6+10;
LL ans;
LL xorn(LL n) //1~n连续异或的值;
{
LL t = n & 3ll;
if (t & 1ll)
return t / 2ll ^ 1ll;
return t / 2ll ^ n;
}
LL xorpow(LL a,LL b) // b个a连续异或
{
if(b%2==0) return 0;
else return a;
}
LL getnn(LL n,LL k) //n层k叉树的加点个数
{
LL res=0,t=1;
while(n--)
{
res+=t;
t*=k;
}
return res;
}
LL man(LL n,LL k) //n层满k叉树的异或值;
{
if(n<=0) return 0;
LL res=0,sz=getnn(n,k),t=1;
for(LL i=1;i<=n;i++)
{
res^=xorpow(sz,t);
sz=(sz-1)/k;
t*=k;
}
return res;
}
void dfs(LL n, LL k)
{
if(n==0) return ;
LL deep = 0;
for (LL m = n,t=1;m>0; t*=k) //得到深度
{
m-=t;
deep++;
}
if(getnn(deep,k)==n) //判断是否是满k叉树?如果是直接得出答案;
{
ans^=man(deep,k);
return ;
}
else
{
if(deep<=2) //深度为2,不用在递归了,到头了,直接求异或
{
ans^=n;
ans^=xorpow(1ll,n-1);
return ;
}
else
{
ans ^= n;
LL tp=n-getnn(deep-1,k);
for(LL i=1;i<=deep-2;i++) tp/=k;
ans^=(xorpow(man(deep-1,k),tp));//深度-1的满k叉树
ans^=(xorpow(man(deep-2,k),k-tp-1));//深度-2 的满k叉树
dfs(n-1-tp*getnn(deep-1,k)-getnn(deep-2,k)*(k-1-tp),k); //剩下的子树,dfs求;
}
}
} int main()
{
int ncase;
scanf("%d",&ncase);
while(ncase--)
{
LL n,k;
scanf("%lld%lld",&n,&k);
if(k==1)
{
printf("%lld\n",xorn(n));
}
else
{
ans=0;
dfs(n,k);
printf("%lld\n",ans);
}
}
return 0;
} /**************************************************/
/** Copyright Notice **/
/** writer: wurong **/
/** school: nyist **/
/** blog : http://www.cnblogs.com/coded-ream/ **/
/**************************************************/ /** 1000000000000000000 1000000000000000000 */

hdu 6121 Build a tree的更多相关文章

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

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

  2. 2017多校第7场 HDU 6121 Build a tree K叉树,思维

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6121 题意:一个n个点的完全k叉树,求每个节点的size的异或和. 解法:容易发现,考虑根的所有孩子, ...

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

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

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

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

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

  6. HDU 6121 Build a tree —— 2017 Multi-University Training 7

    HazelFan wants to build a rooted tree. The tree has nn nodes labeled 0 to n−1, and the father of the ...

  7. hdu6121 Build a tree 模拟

    /** 题目:hdu6121 Build a tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6121 题意:n个点标号为0~n-1:节点i的父节点 ...

  8. hdu6121 Build a tree

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6121 题面: Build a tree Time Limit: 2000/1000 MS (J ...

  9. hdu 5274 Dylans loves tree(LCA + 线段树)

    Dylans loves tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

随机推荐

  1. struts2获取服务器临时目录

      CreateTime--2017年9月7日08:57:39 Author:Marydon struts2获取服务器(tomcat.WebLogic)的临时目录 需要导入: import java. ...

  2. 【Excle数据透视】如何用含有单元格的数据来创建数据透视

    取消合并单元格,填充相同内容项,然后创建数据透视表. 如下图:需要使用数据创建数据透视表 步骤一 开始→格式刷,然后对单元格区域G2:G15使用格式刷功能,保留合并单元格格式 步骤二 选中A2:A18 ...

  3. css:html() text() val()

    转http://www.jb51.net/article/35867.htm .html()用为读取和修改元素的HTML标签    对应js中的innerHTML .html()是用来读取元素的HTM ...

  4. MySQL常用经典语句

    http://www.cnblogs.com/see7di/archive/2010/04/27/2239909.html MySQL常用经典语句 .重命名表ALTER TABLE tbl1 RENA ...

  5. iOS UITableViewDelegate && UITableViewDataSource 执行顺序

    #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableV ...

  6. 这样好用的ReactiveCocoa,根本停不下来【转载】

    前戏我个人非常推崇ReactiveCocoa,它就像中国的太极,太极生两仪,两仪生四象,四象生八卦,八卦生万物.ReactiveCocoa是一个高度抽象的编程框架,它真的很抽象,初看你不知道它是要干嘛 ...

  7. 设置jvm运行内存

    :1.右击项目—Bulid Path—Configure Build Path—Libraries,找到JRE System Libraary[Sun JDK 1.6.0_13],选中JRE Syst ...

  8. 五分钟了解 Service Mesh

      1 背景   1.1 多语言   微服务理念是提倡不同业务使用最适合它的语言开发,现实情况也确实如此,尤其是AI的兴起,一般大型互联网公司存在 C/C++.Java.Golang.PHP.Pyth ...

  9. 多媒体开发之---如何确定slice_header slice_type 的位置

    引用网友的问答:我找到0x000001 NAL的开头了,请问如何确定slice head的位置,继而得出slice_type呢?Nal unit后紧跟的就是slice head吗?标准里的循环让人看得 ...

  10. 基于redis的分布式锁二种应用场景

    “分布式锁”是用来解决分布式应用中“并发冲突”的一种常用手段,实现方式一般有基于zookeeper及基于redis二种.具体到业务场景中,我们要考虑二种情况: 一.抢不到锁的请求,允许丢弃(即:忽略) ...