【2017 Multi-University Training Contest - Team 7 && hdu 6121】Build a tree
【链接】点击打开链接
【题意】
询问n个点的完全k叉树,所有子树节点个数的异或总和为多少。
【题解】
考虑如下的一棵k=3叉树,假设这棵树恰好有n个节点.
因为满的k叉树,第i层的节点个数为k^(i-1);
则我们找到最大的d;
使得
k^0+k^1+..+k^(d-1) <=n
自此,我们会发现,整棵树可以分成若干个树的深度大小为d和d-1的满k叉树。
如上图,d=3,两个圈起来的,就是一个深度为3的满k叉树和一个深度为2的满k叉树。
当然,还可能会有一个子树,它不是满的k叉树。
如上图中没有被圈出来的部分.
深度大小为d的满k叉树的个数,可以用rest =
n-(k^0+k^1+..+k^(d-1))算出来;
它的个数就是rest/num[d],(其中num[d]表示第d层的满k叉树的节点个数.)
就是每num[d]个最下边的那些点可以将一个深度为d-1的满k叉树组成深度为d的满k叉树。
然后看看rest%num[d]是不是为0.
如果不为0的话,就会有一棵子树不是满k叉树;
则肯定还有k-rest/num[d]-1棵是深度为d-1的满k叉树。
然后思考那个不是满k叉树的。
会发现.那棵子树的问题。仍然是我们最开始面临的问题。
是可以递归解决的!
获取那个子树的大小,然后递归解决就好!
(深度为d和深度为d-1的满k叉树的子树异或和,单独写一个dfs来做就好)
(不要忘记有多个子树,所以对应的答案要异或和子树的个数对应次数)
k=1的情况要单独处理。找规律就好。就是1^2^3..^n的值。。
(要注意根节点的儿子不够k个的情况。。那个时候就不用递归了,直接处理答案)
【错的次数】
【反思】
编程比较难。思路不难想。
【代码】
#include <bits/stdc++.h>
using namespace std;
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define ri(x) scanf("%d",&x)
#define rl(x) scanf("%lld",&x)
#define oi(x) printf("%d",x)
#define ol(x) printf("%lld",x)
#define os(x) printf(x)
#define LL long long LL k,num[100],tot[100],ans; LL f(LL x,LL y){
if (y&1)
return x;
else
return 0;
} LL dfs(int d){
LL now = 0,temp = 0;
rep2(i,d,1){
temp = temp*k + 1;
now ^= f(temp,num[i]);
}
return now;
} void solve(LL n){
num[1] = 1,tot[1] = 1;
int d = 1;
while (1){
d++;
num[d] = num[d-1]*k;
tot[d] = tot[d-1]+num[d];
if (tot[d]>n) break;
}
d--;
LL numdp1 = 0,numd = 0,rest = n-tot[d];
if (d == 1 && rest <= k){
ans ^= f(1,rest);
ans ^= n;
return;
}
numdp1 = rest/num[d],numd = k - numdp1 - 1;
LL trest = rest%num[d]; ans ^= f(dfs(d),numdp1); LL temp1 = dfs(d-1);
ans ^= f(temp1,numd); if (trest==0)
ans ^= temp1;
else
solve(trest+tot[d-1]); ans ^= n;
} int main(){
//freopen("D:\\rush.txt","r",stdin);
int T;
ri(T);
while (T--){
LL n;
rl(n),rl(k);
ans = 0;
if (k==1){
n--;
if (n%4==0) ans = 1;
if (n%4==1) ans = n + 2;
if (n%4==2) ans = 0;
if (n%4==3) ans = n+1;
}else
solve(n);
ol(ans);puts("");
}
return 0;
}
【2017 Multi-University Training Contest - Team 7 && hdu 6121】Build a tree的更多相关文章
- 【 2017 Multi-University Training Contest - Team 9 && hdu 6162】Ch’s gift
[链接]h在这里写链接 [题意] 给你一棵树,每个节点上都有一个权值. 然后给你m个询问,每个询问(x,y,a,b); 表示询问x->y这条路径上权值在[a,b]范围内的节点的权值和. [题解] ...
- 2017 Multi-University Training Contest - Team 2 &&hdu 6050 Funny Function
Funny Function Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 2017 Multi-University Training Contest - Team 2 &&hdu 6053 TrickGCD
TrickGCD Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- 2017 Multi-University Training Contest - Team 2&&hdu 6047 Maximum Sequence
Maximum Sequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 2017 Multi-University Training Contest - Team 2 &hdu 6055 Regular polygon
Regular polygon Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- 【2017中国大学生程序设计竞赛 - 网络选拔赛 && hdu 6154】CaoHaha's staff
[链接]点击打开链接 [题意] 给你一个面积,让你求围成这个面积最少需要几条边,其中边的连线只能是在坐标轴上边长为1的的线或者是两个边长为1 的线的对角线. [题解] 找规律题 考虑s[i]表示i条边 ...
- 【2017中国大学生程序设计竞赛 - 网络选拔赛 hdu 6150】Vertex Cover
[链接]点击打开链接 [题意] 有人写了一个最小点覆盖的贪心算法,然后,让你去hack它. 并且,要求这个算法得到的错误答案,是正确答案的三倍. 让你任意输出hack数据,点数<=500 [题解 ...
- 2017 Multi-University Training Contest - Team 1 1006&&HDU 6038 Function【DFS+数论】
Function Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】
FFF at Valentine Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
随机推荐
- R学习:《R语言数据分析与挖掘实战》PDF代码
分三个部分:基础篇.实战篇.提高篇.基础篇介绍了数据挖掘的基本原理,实战篇介绍了一个个真实案例,通过对案例深入浅出的剖析,使读者在不知不觉中通过案例实践获得数据挖掘项目经验,同时快速领悟看似难懂的数据 ...
- iOS 的组件化开发
在一个APP开发过程中,如果项目较小且团队人数较少,使用最基本的MVC.MVVM开发就已经足够了,因为维护成本比较低. 但是当一个项目开发团队人数较多时,因为每个人都会负责相应组件的开发,常规开发模式 ...
- Dcloud+mui 压缩上传图片到服务器
chooseImgFromAlbums选择图片 chooseImgFromPictures 拍照 changeToLocalUrl 转换成可用的路径 uploadpic.compressImg 压缩图 ...
- 【Henu ACM Round#14 B】Duff in Love
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 让你在n的因子里面找一个最大的数字x 且x的因子全都不是完全平方数(y^2,y>1) O(sqrt(n))找出n的所有因子. ...
- 读MBA经历回想(下)做法决定结果——北漂18年(49)
上期聊了目的决定了手段,这次说说详细做法决定了最后的结果. 差额面试被淘汰的高分学员 2005年,是北京邮电大学工商管理学入学考试第一个差额淘汰的年份.意思是过分数线(165分)的人数超过了录取人数, ...
- XCode6报数组越界错误的问题
今天碰到一个非常奇葩的问题, 调试了半天: 错误:"index 0 beyond bounds for empty array", 意思就是说数据源数组为nil, 所以你调用直接 ...
- jquery20--animate() : 运动的方法
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- ASP.NET WebAPI RC 竟然不支持最常用的json传参
壮士断腕(WCF Web API),为的是 ASP.NET Web API 的横空出世,再加上它的开放(开源),于是对之产生了一点点痴情,并写下了HttpClient + ASP.NET Web AP ...
- RPC简易学习
0.RPC简介 RPC, 英文全称:Remote Process Call. 中文全称:远程过程调用. 客户端通过网络请求调用远程服务端对外暴露服务.常用的两种RPC协议:TCP.HTTP. ...
- kali之EtterCap学习
EtterCap是一个基于ARP地址欺骗方式的网络嗅探工具,主要适用于交换局域网络.借助于EtterCap嗅探软件,渗透测试人员可以检测网络内明文数据通讯的安全性,及时采取措施,避免敏感的用户名/密码 ...