hdu6121

题意

给出一棵树,\(0\) 为根节点,节点 \(i\) 的父节点标号是 \(\lfloor\frac{i-1}{k}\rfloor\),求所有子树大小的异或和。

分析

找规律。在纸上画个十几个一定可以找到规律(亲测有效)。

虽然数据很大,但是我们可以特判掉 \(k=1\) 的情况,同样有规律。

那么当 \(k > 1\) 时,树的叶子节点的数量的增长速度是很快的,而且叶子节点一定是连续分布的,也是说会有大量状态类似的子树,既然是求异或和,我们只需要判断有相同大小的子树的数量是否为奇数即可。

自底向上不断合并子树,记录几种状态的子树及其大小。

我这里分为三种:

  1. 可以独自向上合并而不需要借助其它节点的那些子树,也就是可以直接占据一个父节点
  2. 不能独自向上合并,必须借助第三类,或者由第一类多的子树转变而来
  3. 剩下的节点

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
int T;
scanf("%d", &T);
while(T--) {
ll n, k;
scanf("%lld%lld", &n, &k);
ll ans = 0;
if(k == 1) {
ll nn = n % 4;
if(nn == 0) ans = n;
else if(nn == 1) ans = 1;
else if(nn == 2) ans = n + 1;
else ans = 0;
} else {
ll sz = 1, lsz = 1;
int cnt = 1;
n--;
while(n > 0) {
sz = sz * k;
if(n - sz < 0) break;
n -= sz;
lsz = sz;
cnt++;
}
ll cnt1 = 0, cnt2 = 0, cnt3 = 0;
ll sz1 = 0, sz2 = 0, sz3 = 0;
if(n > 0) {
ans ^= (n & 1);
cnt1 = n / k; if(cnt1 > 0) sz1 = k + 1;
if(n % k > 0) { cnt2 = 1; sz2 = n % k + 1; }
}
cnt3 = lsz - cnt1 - cnt2;
sz3 = 1;
while(cnt--) {
ans ^= (cnt3 & 1) * sz3;
ans ^= (cnt1 & 1) * sz1;
ans ^= (cnt2 & 1) * sz2;
if(cnt1 / k == 0) {
sz2 += sz1 * cnt1 + 1;
if(cnt1 + cnt2 < k) {
cnt3 -= k - cnt1 - cnt2;
sz2 += (k - cnt1 - cnt2) * sz3;
cnt2 = 1;
}
cnt1 = 0;
sz1 = 0;
} else {
sz2 += sz1 * (cnt1 % k);
ll c = cnt1 % k + cnt2;
if(c < k) {
cnt3 -= k - c;
sz2 += (k - c) * sz3;
}
cnt2 = 1;
sz2++;
cnt1 = cnt1 / k;
sz1 = sz1 * k + 1;
}
cnt3 /= k;
sz3 = sz3 * k + 1;
if(cnt3 == 0) sz3 = 0;
}
}
printf("%lld\n", ans);
}
return 0;
}

hdu6121的更多相关文章

  1. hdu6121 Build a tree 模拟

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

  2. 【hdu6121】 Build a tree 简单数学题

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6121 我好像推得挺久的诶..... 题目大意:给你一棵有$n$个点的树,根节点为$0$,对于其余节点 ...

  3. hdu6121 Build a tree

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

  4. 【暴力】hdu6121 Build a tree

    给你n,K,让你构造出一颗n个结点的完全K叉树,求所有结点子树大小的异或和. 先把n号结点到根的路径提取出来单独计算.然后这条路径把每一层分成了左右两部分,每一层的左侧和其上一层的右侧的结点的子树大小 ...

  5. hdu6121 build a tree(树)

    题解: 可以考虑每一层结点的子树大小 必定满足下面的情况,即 a,a,a,a,a,a,b,c,c,c,c........ 然后每一层依次往上更新,结果是不变的 一共有logn层,所以依次扫上去,统计结 ...

  6. 【思维】2017多校训练七 HDU6121 Build a tree

    http://acm.hdu.edu.cn/showproblem.php?pid=6121 [题意] 询问n个结点的完全k叉树,所有子树结点个数的异或和是多少 [思路] 一棵完全K叉树,对于树的每一 ...

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

  8. 2017 Multi-University Training Contest - Team 7

    HDU6121 Build a tree 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6121 题目意思:一棵 n 个点的完全 k 叉树,结点标号从 ...

随机推荐

  1. chrome 不支持12px以下字体为题的解决

    现英文9px 设置 在chrome 下无效,可以通过 -webkit-transform: scale(0.75); 12*0.75 =9  得到小字体(在chrome浏览器下 大小缩放到0.75倍) ...

  2. bzoj 1110 [POI2007]砝码Odw 贪心+进制转化

    [POI2007]砝码Odw Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 661  Solved: 366[Submit][Status][Disc ...

  3. 2015年网易校招Java开发工程师(技术架构)在线笔试题

    1.  程序和进程的本质区别是? A.在外存和内存存储 B.非顺序和顺序执行机器指令 C.独占使用和分时使用计算机资源 D.静态和动态特征 参考答案分析: 进程与应用程序的区别: 进程(Process ...

  4. hadoop 架构

  5. nginx 设置ip地址访问,但是设置域名访问不了

    一.导语 在Nginx的设置过程中,ip地址能正常访问的,但是把ip地址转换成域名,就访问不了了,这个是怎么回事呢?今天来探讨一下 二.设置ip地址做负载均衡 2.1.server端 server { ...

  6. TypeConverter使用

    如下代码, <Window.Resources> <local:Human x:Key="human" Name="Tester1" Chil ...

  7. kubernetes 参考资料

    kubernetes 参考资料 非常建议先花20分钟,完成这个官方的交互式指南:https://kubernetes.io/docs/tutorials/kubernetes-basics/ 这个教程 ...

  8. 布局之BFC

    BFC 什么是BFC,在哪里需要用到BFC,BFC有什么规则?生成BFC有什么条件?这几个问题,我将为大家一一解释,下面我们进入正题. BFC(Block formatting context)直译为 ...

  9. CSS3学习笔记之径向展开菜单

    效果截图: HTML代码: <div class="menu-wrap"> <nav> <a href="" class=&quo ...

  10. c#之字符串函数

    1.常用的字符串函数 Compare 比较字符串的内容,考虑文化背景(场所),确定某些字符是否相等 int Compare(string str1,string str2) int Compare(s ...