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;
}

最新文章

  1. Typical EEG waveforms during sleep 睡眠状态下的几种典型EEG波形
  2. 【Java EE 学习 29 下】【JDBC编程中操作Oracle数据库】【调用存储过程的方法】
  3. linux 下 apache相关;启动、停止、重启命令;配置文件位置等等
  4. 数据类型安全验证都交给TryParse吧
  5. Vijos1921严厉的班长
  6. 【BZOJ2223/3524】[Coci 2009]PATULJCI
  7. 一张思维导图说明jQuery的AJAX请求机制
  8. JRebel_修改class后无法正确调试问题解决【2014-03-12】
  9. Navicate DataModel 注册码
  10. 用Java开发一个本地服务管理软件
  11. 学习AngularJs:Directive指令用法
  12. EF中使用Contains方法
  13. rsyslog的ommsql模块如何连接MYSQL的非标准数据库端口?
  14. DFS 练习 (这篇真的是随笔)
  15. CocoaChina 第四个测试
  16. Unity 发布的 WenGL 使用SendMessage传递多个参数
  17. Python爬虫入门教程 5-100 27270图片爬取
  18. 【EMV L2】2CS.001.00 ~ 2CS.007.00
  19. @ConfigurationProperties 配置详解
  20. 【C#复习总结】探究各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字

热门文章

  1. AGC017C Snuke and Spells(巧妙的线段覆盖模型)
  2. C++——内存使用
  3. 【NOIP 模拟赛】改造二叉树 最长上升子序列
  4. JavaScript渐变效果的实现
  5. GDB使用小记
  6. LowercaseRoutesMVC ASP.NET MVC routes to lowercase URLs
  7. Codeforces Round #350 (Div. 2) A
  8. php spl库的使用(PHP标准库)【摘抄引用】
  9. [洛谷P3501] [POI2010]ANT-Antisymmetry
  10. Eclipse+Tomcat实现热部署/热加载配置,修改java代码无需重启tomcat