hdu6121
hdu6121
题意
给出一棵树,\(0\) 为根节点,节点 \(i\) 的父节点标号是 \(\lfloor\frac{i-1}{k}\rfloor\),求所有子树大小的异或和。
分析
找规律。在纸上画个十几个一定可以找到规律(亲测有效)。
虽然数据很大,但是我们可以特判掉 \(k=1\) 的情况,同样有规律。
那么当 \(k > 1\) 时,树的叶子节点的数量的增长速度是很快的,而且叶子节点一定是连续分布的,也是说会有大量状态类似的子树,既然是求异或和,我们只需要判断有相同大小的子树的数量是否为奇数即可。
自底向上不断合并子树,记录几种状态的子树及其大小。
我这里分为三种:
- 可以独自向上合并而不需要借助其它节点的那些子树,也就是可以直接占据一个父节点
- 不能独自向上合并,必须借助第三类,或者由第一类多的子树转变而来
- 剩下的节点
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的更多相关文章
- hdu6121 Build a tree 模拟
/** 题目:hdu6121 Build a tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6121 题意:n个点标号为0~n-1:节点i的父节点 ...
- 【hdu6121】 Build a tree 简单数学题
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6121 我好像推得挺久的诶..... 题目大意:给你一棵有$n$个点的树,根节点为$0$,对于其余节点 ...
- hdu6121 Build a tree
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6121 题面: Build a tree Time Limit: 2000/1000 MS (J ...
- 【暴力】hdu6121 Build a tree
给你n,K,让你构造出一颗n个结点的完全K叉树,求所有结点子树大小的异或和. 先把n号结点到根的路径提取出来单独计算.然后这条路径把每一层分成了左右两部分,每一层的左侧和其上一层的右侧的结点的子树大小 ...
- hdu6121 build a tree(树)
题解: 可以考虑每一层结点的子树大小 必定满足下面的情况,即 a,a,a,a,a,a,b,c,c,c,c........ 然后每一层依次往上更新,结果是不变的 一共有logn层,所以依次扫上去,统计结 ...
- 【思维】2017多校训练七 HDU6121 Build a tree
http://acm.hdu.edu.cn/showproblem.php?pid=6121 [题意] 询问n个结点的完全k叉树,所有子树结点个数的异或和是多少 [思路] 一棵完全K叉树,对于树的每一 ...
- 「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 ...
- 2017 Multi-University Training Contest - Team 7
HDU6121 Build a tree 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6121 题目意思:一棵 n 个点的完全 k 叉树,结点标号从 ...
随机推荐
- 【题解】NOI2015寿司晚宴
想好久啊+不敢写啊……但果然人还是应当勇敢自信,只有坚定地去尝试,才会知道最后的结果.1A真的太开心啦,不过好像我的做法还是比较复杂的样子……理解起来应该算是比较容易好懂的类型,大家可以参考一下思路~ ...
- OI中组合数的若干求法与CRT
OI中组合数的若干求法与CRT 只是下决心整理一下子呢~ 说明:本篇文章采用\(\binom{a}{b}\)而不是\(C_{a}^b\),以\(p\)指代模数,\(fac_i\)指代\(i!\),\( ...
- codeforces2015ICL,Finals,Div.1#J Ceizenpok’s formula 扩展Lucas定理 扩展CRT
默默敲了一个下午,终于过了, 题目传送门 扩展Lucas是什么,就是对于模数p,p不是质数,但是不大,如果是1e9这种大数,可能没办法, 对于1000000之内的数是可以轻松解决的. 题解传送门 代码 ...
- jw player笔记二----修改logo
一.修改HTML5模式下的logo 见http://blog.csdn.net/xiong_mao_1/article/details/17222757 二.修改FLASH模式下的logo IE7/8 ...
- Hibernate 懒加载 错误----no session
错误: unable to evaluate the expression Method threw 'org.hibernate.LazyInitializa org.hibernate.LazyI ...
- lesson 4 再谈继承多态,抽象类和接口
再谈多态,抽象类和接口 上一次博客已经概念性的概述了继承多态,抽象类和接口,这次来具体的谈一谈他们之间的联系和需要注意的地方. 一.继承和多态:Inheritance (继承) & Polym ...
- oracle12c创建用户等问题
一:前言 这几天我重新装了下电脑,然后自己有试着去装了下oracle11g,结果还是失败了然后我自己又去下载了最新的oracle12c,oracle12c中有两个用户sys和system,scott已 ...
- 联系人数据存储Demo源代码
源码下载地址:07-联系人数据存储.zip35.8 KB // MJPerson.h // // MJPerson.h // 07-联系人数据存储 // // Created by apple ...
- [bzoj3994][SDOI2015]约数个数和-数论
Brief Description 计算\(\sum_{i\leqslant n}\sum_{j\leqslant m}\sigma_0(ij)\). Algorithm Design 首先证明一个结 ...
- CentOS 7 主机加固手册-中
CentOS 7 主机加固手册-上 CentOS 7 主机加固手册-中 CentOS 7 主机加固手册-下 0x0c 设置/boot/grub2/grub.cfg权限 Set grub.conf ...