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

题目大意:

给你一颗 n 个节点的完全 k 叉树,问你这棵树中所有子树结点个数的总异或值。

分析:

我们很容易看到于发现对于这样的一颗树 , 肯定是只有一颗子树不是满k叉树 , 知道这样后 , 这就很简单了;

我们可以找到不满的树的编号P , 那左边就要(P-1)棵满树 , 右边有(n-P)棵少一层的满树 , 我们在分析,如果左边的树的数量是偶数 , 那我们可以不用计算 , 奇数只要计算一颗;右边同样的道理:

还有一个问题就是k==1的情况:需要找到规律

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,k;
///返回1~x层的满树有多少结点
ll sum(ll x)
{
if(x<=) return ;
if(x==) return ;
ll ans=;
for(ll i= ; i<x ; i++)
{
ans*=k;ans++;
}
return ans;
}
///对于一颗深度为 x 层的满树,返回它的异或值
ll comf(ll x)
{
if(x<=) return ;
if(x==) return ;
ll ans=;
if(k%==)
{
return sum(x);
}
else
{
ll temp=;
for(ll i= ; i<=x ; i++)
{
temp*=k;
temp++;
ans=ans^temp;
}
}
return ans;
}
///对于一颗 k 叉树,返回他的异或值
ll F(ll n)
{
//printf("520");
if(n==) return ; ll temp=n-;///找到不满的树
ll L,R;
ll x=;///层数
while((temp-)/k>)///防止爆long long
{
temp=(temp-)/k;
x++;
}
x++;
if(n==sum(x)) return comf(x);
L=temp-;///满k的树有多少棵
R=k-temp;///缺一层满k的树有多少课
ll ans=n;
if(L%==)
{
ans=ans^comf(x-);
}
if(R%==)
{
ans=ans^comf(x-);
}
///不满k树有多少课节点
n=n-L*sum(x-)-R*sum(x-)-;
ans=ans^F(n);
return ans; }
int main()
{
int T;scanf("%d",&T);
while(T--)
{
scanf("%lld%lld",&n,&k);
if(k==)
printf("%lld\n",n%==?:(n%==?n+:(n%==?:n)));
else printf("%lld\n",F(n));
}
}

最新文章

  1. Jquery学习笔记 --ajax删除用户,使用了js原生ajax
  2. Quartz中的时间表达式介绍和常用表达式
  3. PlaceHolder的两种实现方式
  4. 新浪云php与java连接MySQL数据库
  5. PLSQL_Oracle面试整理(汇总)
  6. 3527: [Zjoi2014]力 - BZOJ
  7. js设计模式(4)---组合模式
  8. HDU 2673 shǎ崽 OrOrOrOrz
  9. 照片详细解释YUV420数据格式
  10. Xcode使用小结1
  11. LINUX 笔记-MOUNT
  12. Python 项目实践三(Web应用程序)第一篇
  13. Uva - 210 - Concurrency Simulator
  14. Linux+.Net Core+Nginx(在Linux上使用Nginx反向代理.Net Core 项目)
  15. numpy统计分布显示
  16. boost.Asio lib
  17. python练习题-day1
  18. 自定义MVC框架之工具类-分页类的封装
  19. SpringMVC学习笔记二:常用注解
  20. HTML 求阶乘之和

热门文章

  1. 内网渗透 - 权限维持 - Linux
  2. 二维数组中的查找-剑指 offerP38
  3. vue—拖拽
  4. Java相关面试题总结+答案(六)
  5. centos7下搭建Testlink环境详细过程
  6. 移动端自动化测试之Appium的工作原理学习
  7. [BNDSOJ] 小P的数列代码
  8. A + B Problem II(1002)
  9. jsp:include 通过变量作为路径动态引入
  10. PHP表单数组的具体使用方法介绍