http://acm.hdu.edu.cn/showproblem.php?pid=6121

【题意】

  • 询问n个结点的完全k叉树,所有子树结点个数的异或和是多少

【思路】

  • 一棵完全K叉树,对于树的每一层,我们可以分为三种结点:
  1. 满k叉树的结点
  2. 不满的k叉树
  3. 比第一种情况少一层的满结点的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的更多相关文章

  1. 【极角排序+双指针线性扫】2017多校训练七 HDU 6127 Hard challenge

    acm.hdu.edu.cn/showproblem.php?pid=6127 [题意] 给定平面直角坐标系中的n个点,这n个点每个点都有一个点权 这n个点两两可以连乘一条线段,定义每条线段的权值为线 ...

  2. 【(好题)组合数+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 ...

  3. hdu6035[dfs+思维] 2017多校1

    /*hdu6035[dfs+思维] 2017多校1*/ //合并色块, 妙啊妙啊 #include<bits/stdc++.h> using namespace std; ; const ...

  4. hdu6074[并查集+LCA+思维] 2017多校4

    看了标答感觉思路清晰了许多,用并查集来维护全联通块的点数和边权和. 用另一个up[]数组(也是并查集)来保证每条边不会被重复附权值,这样我们只要将询问按权值从小到大排序,一定能的到最小的边权和与联通块 ...

  5. 「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 ...

  6. hdu6121 Build a tree 模拟

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

  7. hdu6121 Build a tree

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

  8. HDU6038-Function-数学+思维-2017多校Team01

    学长讲座讲过的,代码也讲过了,然而,当时上课没来听,听代码的时候也一脸o((⊙﹏⊙))o 我的妈呀,语文不好是硬伤,看题意看了好久好久好久(死一死)... 数学+思维题,代码懂了,也能写出来,但是还是 ...

  9. 2017 多校训练 1002 Balala Power!

    Balala Power! Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

随机推荐

  1. 数字(number)

    数字(number) Time Limit:2000ms   Memory Limit:128MB 题目描述 LYK定义了一个新的计算. 具体地,一开始它有两个数字a和b. 每一步,它可以将b增加1, ...

  2. checkbox:全选、全不选、单选(慕课网题目)

    任务 1.在第27行处补充完整,实现当点击"全选"按钮时,将选中所有的复选项. 提示:document.getElementsByTagName("input" ...

  3. express搭建平台

    1.nodeJs的安装(npm的安装) nodejs官方下载地址:https://nodejs.org 2.express的安装( $ npm install -g express #全局安装expr ...

  4. SpringBoot学习 (一) Eclipse中创建新的SpringBoot项目

    1. Eclipse中安装STS插件 (1)在线安装 Help--Eclipse Marketplace... 搜索“STS”,点击“install”安装    (2)本地安装 打开网页 http:/ ...

  5. 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 ...

  6. python+selenium(python基础)

    1.编辑器的选择 好刀不误砍柴工,那么我们写代码也需要一个利器,虽然python自带有python shell ,但我们在执行代码的时候,需要开很多窗口,最重要的一点是,代码文件的管理很不方便,笔者推 ...

  7. js生成随机的uuid

    function generateUUID() { var d = new Date().getTime(); if(window.performance && typeof wind ...

  8. uva1619 Feel Good

    单调队列,滑动窗口 int t=0; while(scanf("%d",&n)==1){ if(t) printf("\n"); //有点方便 单调队列 ...

  9. zabbix设置发送消息的时间

    需求:比如我有两个报警的媒介:邮件和微信,但是下班之后,晚上我不希望手机一直响,打扰我睡觉,邮件无所谓,可以24h发送 分析:那现在就需要把微信分时间段发送:比如06:00-24:00   这个时间点 ...

  10. wkhtmltopdf导出html到pdf

    1.使用背景     最近公司需要把html页面的内容生成pdf并下载,试过很多方法都没有满意的效果,后来找到wkhtmltopdf这款软件,终于解决了这个问题. wkhtmltopdf是exe文件, ...