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. LeetCode -- 3SumCloset

    Question: Given an array S of n integers, find three integers in S such that the sum is closest to a ...

  2. 黑群晖DSM 6.1网卡支持列表

    黑群晖DSM 6.1网卡支持列表 Network Drivers====================================AMDamd8111e : AMD 8111 (new PCI ...

  3. thymeleaf 布局layout

    以前写过一篇使用thymeleaf实现div中加载html 大部分内容都没问题,只是部分知识已经过时了. 重新记录: 依赖依然是 <dependency> <groupId>n ...

  4. [洛谷P1131][ZJOI2007]时态同步

    题目大意:给你一棵树,每条边有边权,要求增加一些边的边权,使得根节点到每个叶子节点的距离相等,求出最少共增加多少边权. 题解:树形$DP$,对于每个点,如果它到它的子树中的叶子节点距离不同,一定要在这 ...

  5. gdkoi前的复习

    又浪了一天…… 整理下学的,这两天都温习(预习)一下吧. 27号就是gdkoi了好怕…… 数据结构 ------树 -------------平衡树 -------------线段树/树状数组 --- ...

  6. Android中代码设置RadioButton的高端技巧

    不知道怎么起标题,就这样了. 目前主要讲两个方面内容: 代码方式 设置RadioButton的 android:button . android:background 等属性为 @null : 代码方 ...

  7. 门户系统整合sso cookie共享及显示用户信息

    1.1 门户系统整合sso 在门户系统点击登录连接跳转到登录页面.登录成功后,跳转到门户系统的首页,在门户系统中需要从cookie中 把token取出来.所以必须在登录成功后把token写入cooki ...

  8. Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition) B

    B. Little Artem and Grasshopper time limit per test 2 seconds memory limit per test 256 megabytes in ...

  9. lvm扩容

    111 mkfs -t xfs /dev/sda3 112 pvcreate /dev/sda3 113 vgs 114 vgextend cl /dev/sda3 115 lvscan 116 vg ...

  10. C# windows application Hello World

    创建一个Windows application项目,然后可以调用里面的工具来生成代码. using System; using System.Collections.Generic; using Sy ...