hdu 6121 Build a tree
/**
* 题意:一棵 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的更多相关文章
- HDU 6121 Build a tree(找规律+模拟)
Build a tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)To ...
- 2017多校第7场 HDU 6121 Build a tree K叉树,思维
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6121 题意:一个n个点的完全k叉树,求每个节点的size的异或和. 解法:容易发现,考虑根的所有孩子, ...
- HDU 6121 Build a tree(完全K叉树)
http://acm.hdu.edu.cn/showproblem.php?pid=6121 题意:给你一颗完全K叉树,求出每棵子树的节点个数的异或和. 思路: 首先需要了解一些关于完全K叉树或满K叉 ...
- 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 题目大意: 给你一颗 n 个节点的完全 k 叉树,问你这棵树中所有子树结点个数的总异或值. 分析: 我们很 ...
- 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 ...
- hdu6121 Build a tree 模拟
/** 题目:hdu6121 Build a tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6121 题意:n个点标号为0~n-1:节点i的父节点 ...
- hdu6121 Build a tree
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6121 题面: Build a tree Time Limit: 2000/1000 MS (J ...
- hdu 5274 Dylans loves tree(LCA + 线段树)
Dylans loves tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
随机推荐
- Theano学习笔记(四)——导数
导数使用T.grad计算. 这里使用pp()打印梯度的符号表达式. 第3行输出是打印了经过优化器简化的符号梯度表达式,与第1个输出相比确实简单多了. fill((x** TensorConstant{ ...
- PL/SQL Developer 和 instantclient客户端安装配置
PL/SQL Developer 和 instantclient客户端安装配置 oracle的安装我就不写了,不会安装的网上随便找一个教程就能装上,安装起来比較简单.可是,PL/SQL Develop ...
- 云数据库 RDS 版怎么创建数据库和账号MySQL 5.7版
若要使用云数据库RDS,您需要在实例中创建数据库和账号.对于MySQL 5.7版本的实例,您需要通过RDS控制台创建一个初始账号,然后可以通过数据管理(DMS)控制台创建和管理数据库.本文将主要介绍在 ...
- C#中的Dictionary字典类常用方法介绍
using System.Collections.Generic;//引用命名空间//Dictionary可以理解为散列集合 public class DictionaryTest { public ...
- NightWatchJS(转)
关于Nightwatch? Nightwatch.js是一个测试web app和web 站点的自动化测试框架, 使用Node.js编写, 基于Selenium WebDriver API. 它是一个完 ...
- 中兴应用之星携手天翼开放平台:让APP开发更简单
日前,业内率先的APP开发平台运营商中兴应用之星与中国电信天翼开放平台达成战略合作.即广大用户通过天翼开放平台,可直接享受到应用之星提供的"APP开发服务". 应用之星.中兴通 ...
- xml.etree.ElementTree模块的封装
转载:https://www.cnblogs.com/hongten/p/hongten_python_xml_etree_elementtree.html 1 # -*- coding: utf-8 ...
- Chrome自带恐龙小游戏的源码研究(七)
在上一篇<Chrome自带恐龙小游戏的源码研究(六)>中研究了恐龙的跳跃过程,这一篇研究恐龙与障碍物之间的碰撞检测. 碰撞盒子 游戏中采用的是矩形(非旋转矩形)碰撞.这类碰撞优点是计算比较 ...
- python学习(六)元组学习
元组就是列表的一种,不过元组具有不可变性,而且是用圆括号访问的. 索引(下表索引或者键索引都是用的中括号) #!/usr/bin/python # 这节来学习元组, tuple, 基本上就像一个不可以 ...
- js获取和设置属性的方法
function square(num){ var total = num*num;//局部变量 return total;}var total = 50;//全局变量var number ...