【思维】2017多校训练七 HDU6121 Build a tree
http://acm.hdu.edu.cn/showproblem.php?pid=6121
【题意】
- 询问n个结点的完全k叉树,所有子树结点个数的异或和是多少
【思路】
- 一棵完全K叉树,对于树的每一层,我们可以分为三种结点:
- 满k叉树的结点
- 不满的k叉树
- 比第一种情况少一层的满结点的k叉树

【AC】
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k;
ll ans;
ll kn[],sz[],full[];
int cs;
void Pre()
{
//kn[i]=k^i
kn[]=;
for(int i=;i<=cs;i++)
{
kn[i]=kn[i-]*k;
}
//根结点为第一层,sz[i]为有i层的满k叉树有多少结点
sz[]=;
for(int i=;i<=cs;i++)
{
sz[i]=sz[i-]+kn[i-];
}
//有i层的满k叉树所有子树结点大小的异或和
if(k&)
{
full[]=;
for(int i=;i<=cs;i++)
{
full[i]=full[i-]^sz[i];
}
}
else
{
for(int i=;i<=cs;i++)
{
full[i]=sz[i];
}
}
} void dfs(int cur)
{
ans^=n;
ll lft=n-sz[cur]; //最后一层有多少个
ll l=lft/kn[cur-];//多少个cur层的满k叉树
lft-=l*kn[cur-];
if(lft==)//没有不满的k叉树
{
if(l&) ans^=full[cur];
if((k-l)&) ans^=full[cur-];
return;
}
if(l&) ans^=full[cur];
if((k-l-)&) ans^=full[cur-];
n--;n-=l*sz[cur];n-=(k-l-)*sz[cur-];
dfs(cur-);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
ans=;
scanf("%I64d%I64d",&n,&k);
//k=1特判,打表看出来的
if(k==)
{
if(n%==)
{
ans=n;
}
else if(n%==)
{
ans=;
}
else if(n%==)
{
ans=n+;
}
else
{
ans=;
}
printf("%I64d\n",ans);
continue;
}
//根结点为第一层,结点数为n的完全k叉树有cs层是满的
cs=;
ll t=n;
while(t)
{
t--;
t/=k;
cs++;
}
//预处理
Pre();
ans=;
//递归
dfs(cs);
printf("%I64d\n",ans);
}
return ;
}
【思维】2017多校训练七 HDU6121 Build a tree的更多相关文章
- 【极角排序+双指针线性扫】2017多校训练七 HDU 6127 Hard challenge
acm.hdu.edu.cn/showproblem.php?pid=6127 [题意] 给定平面直角坐标系中的n个点,这n个点每个点都有一个点权 这n个点两两可以连乘一条线段,定义每条线段的权值为线 ...
- 【(好题)组合数+Lucas定理+公式递推(lowbit+滚动数组)+打表找规律】2017多校训练七 HDU 6129 Just do it
http://acm.hdu.edu.cn/showproblem.php?pid=6129 [题意] 对于一个长度为n的序列a,我们可以计算b[i]=a1^a2^......^ai,这样得到序列b ...
- hdu6035[dfs+思维] 2017多校1
/*hdu6035[dfs+思维] 2017多校1*/ //合并色块, 妙啊妙啊 #include<bits/stdc++.h> using namespace std; ; const ...
- hdu6074[并查集+LCA+思维] 2017多校4
看了标答感觉思路清晰了许多,用并查集来维护全联通块的点数和边权和. 用另一个up[]数组(也是并查集)来保证每条边不会被重复附权值,这样我们只要将询问按权值从小到大排序,一定能的到最小的边权和与联通块 ...
- 「2017 Multi-University Training Contest 7」2017多校训练7
1002 Build a tree(递归) 题目链接 HDU6121 Build a tree 有一棵n个点的有根树,标号为0到n-1,i号点的父亲是\(\lfloor\frac{i-1}{k}\rf ...
- 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 ...
- HDU6038-Function-数学+思维-2017多校Team01
学长讲座讲过的,代码也讲过了,然而,当时上课没来听,听代码的时候也一脸o((⊙﹏⊙))o 我的妈呀,语文不好是硬伤,看题意看了好久好久好久(死一死)... 数学+思维题,代码懂了,也能写出来,但是还是 ...
- 2017 多校训练 1002 Balala Power!
Balala Power! Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
随机推荐
- 数字(number)
数字(number) Time Limit:2000ms Memory Limit:128MB 题目描述 LYK定义了一个新的计算. 具体地,一开始它有两个数字a和b. 每一步,它可以将b增加1, ...
- checkbox:全选、全不选、单选(慕课网题目)
任务 1.在第27行处补充完整,实现当点击"全选"按钮时,将选中所有的复选项. 提示:document.getElementsByTagName("input" ...
- express搭建平台
1.nodeJs的安装(npm的安装) nodejs官方下载地址:https://nodejs.org 2.express的安装( $ npm install -g express #全局安装expr ...
- SpringBoot学习 (一) Eclipse中创建新的SpringBoot项目
1. Eclipse中安装STS插件 (1)在线安装 Help--Eclipse Marketplace... 搜索“STS”,点击“install”安装 (2)本地安装 打开网页 http:/ ...
- Long time no blogging
It is a long time before I posted the last blog on myspace and seems that all of my blogs/documents ...
- python+selenium(python基础)
1.编辑器的选择 好刀不误砍柴工,那么我们写代码也需要一个利器,虽然python自带有python shell ,但我们在执行代码的时候,需要开很多窗口,最重要的一点是,代码文件的管理很不方便,笔者推 ...
- js生成随机的uuid
function generateUUID() { var d = new Date().getTime(); if(window.performance && typeof wind ...
- uva1619 Feel Good
单调队列,滑动窗口 int t=0; while(scanf("%d",&n)==1){ if(t) printf("\n"); //有点方便 单调队列 ...
- zabbix设置发送消息的时间
需求:比如我有两个报警的媒介:邮件和微信,但是下班之后,晚上我不希望手机一直响,打扰我睡觉,邮件无所谓,可以24h发送 分析:那现在就需要把微信分时间段发送:比如06:00-24:00 这个时间点 ...
- wkhtmltopdf导出html到pdf
1.使用背景 最近公司需要把html页面的内容生成pdf并下载,试过很多方法都没有满意的效果,后来找到wkhtmltopdf这款软件,终于解决了这个问题. wkhtmltopdf是exe文件, ...