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

【题意】

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

【思路】

  • 一棵完全K叉树,对于树的每一层,我们可以分为三种结点:
  1. 满k叉树的结点
  2. 不满的k叉树
  3. 比第一种情况少一层的满结点的k叉树

【AC】

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. ll n,k;
  5. ll ans;
  6. ll kn[],sz[],full[];
  7. int cs;
  8. void Pre()
  9. {
  10. //kn[i]=k^i
  11. kn[]=;
  12. for(int i=;i<=cs;i++)
  13. {
  14. kn[i]=kn[i-]*k;
  15. }
  16. //根结点为第一层,sz[i]为有i层的满k叉树有多少结点
  17. sz[]=;
  18. for(int i=;i<=cs;i++)
  19. {
  20. sz[i]=sz[i-]+kn[i-];
  21. }
  22. //有i层的满k叉树所有子树结点大小的异或和
  23. if(k&)
  24. {
  25. full[]=;
  26. for(int i=;i<=cs;i++)
  27. {
  28. full[i]=full[i-]^sz[i];
  29. }
  30. }
  31. else
  32. {
  33. for(int i=;i<=cs;i++)
  34. {
  35. full[i]=sz[i];
  36. }
  37. }
  38. }
  39.  
  40. void dfs(int cur)
  41. {
  42. ans^=n;
  43. ll lft=n-sz[cur]; //最后一层有多少个
  44. ll l=lft/kn[cur-];//多少个cur层的满k叉树
  45. lft-=l*kn[cur-];
  46. if(lft==)//没有不满的k叉树
  47. {
  48. if(l&) ans^=full[cur];
  49. if((k-l)&) ans^=full[cur-];
  50. return;
  51. }
  52. if(l&) ans^=full[cur];
  53. if((k-l-)&) ans^=full[cur-];
  54. n--;n-=l*sz[cur];n-=(k-l-)*sz[cur-];
  55. dfs(cur-);
  56. }
  57. int main()
  58. {
  59. int T;
  60. scanf("%d",&T);
  61. while(T--)
  62. {
  63. ans=;
  64. scanf("%I64d%I64d",&n,&k);
  65. //k=1特判,打表看出来的
  66. if(k==)
  67. {
  68. if(n%==)
  69. {
  70. ans=n;
  71. }
  72. else if(n%==)
  73. {
  74. ans=;
  75. }
  76. else if(n%==)
  77. {
  78. ans=n+;
  79. }
  80. else
  81. {
  82. ans=;
  83. }
  84. printf("%I64d\n",ans);
  85. continue;
  86. }
  87. //根结点为第一层,结点数为n的完全k叉树有cs层是满的
  88. cs=;
  89. ll t=n;
  90. while(t)
  91. {
  92. t--;
  93. t/=k;
  94. cs++;
  95. }
  96. //预处理
  97. Pre();
  98. ans=;
  99. //递归
  100. dfs(cs);
  101. printf("%I64d\n",ans);
  102. }
  103. return ;
  104. }

【思维】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. CSS div 塌陷问题

    嵌套塌陷 上下塌陷 overflow:hidden;

  2. angularjs 下select中ng-options使用

    当我有一堆object数据要用下拉框进行显示选择时,可以使用到angularjs中的select中的ng-options的属性.官网网址:https://docs.angularjs.org/api/ ...

  3. 【转】一篇文章,教你学会Git

    一篇文章,教你学会Git 在日常工作中,经常会用到Git操作.但是对于新人来讲,刚上来对Git很陌生,操作起来也很懵逼.本篇文章主要针对刚开始接触Git的新人,理解Git的基本原理,掌握常用的一些命令 ...

  4. 《Python基础教程》 读书笔记 第六章 抽象 函数 参数

    6.1创建函数 函数是可以调用(可能包含参数,也就是放在圆括号中的值),它执行某种行为并且返回一个值.一般来说,内建的callable函数可以用来判断函数是否可调用: >>> x=1 ...

  5. Angular JS中变量定义的基本原则

    在Angular JS开发中,经常需要定义一些变量,关于这些变量的定义方法及作用域应该注意以下几点: 1. 如果能用局部变量解决问题,尽量不要用全局变量. 2. 需要与界面双向绑定的变量采用$scop ...

  6. SAP成都研究院姚瑶:软件质量保证工作的变迁

    大家好,我是来自SAP成都研究院Revenue Cloud 团队的质量工程师 , yoyo.很高兴可以和大家分享我个人的工作体会.每个团队都有QE(Quality Engineer), 相信大家对QE ...

  7. ECharts是我接触过的最优秀的可视化工具,也是进步最快的软件,希望它早日成为世界级的开源项目。

    ECharts的广泛网址: http://echarts.baidu.com/doc/example.html 零编程玩转图表: http://tushuo.baidu.com/?qq-pf-to=p ...

  8. 富通天下(W 笔试)

    纸质算法题目 1.给你一个字符串,找出其中第一个只出现过一次的字符及其位置 正解:一层for循环,循环按序取出字符串中的单个字符,循环体内部使用String类的indexOf(),从当前字符下标往后搜 ...

  9. Graveyard LA3708

    白书第一章例题4 思维. 先固定一点不动,假设最后一共N个点,那么编号为0,1,...N-1, 0不动,原来的n个点分别占据i/n*N的位置(记为pos),移动到pos四舍五入的位置即可. 证明一:有 ...

  10. Bug的定义和分类

    什么是BUG 使用人工或自动手段,来运行或测试某个系统的过程.其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别 BUG分类 完全没有实现的功能 基本实现了用户需要的功能,但是运行时 ...