/**
题目:hdu6121 Build a tree
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6121
题意:n个点标号为0~n-1;节点i的父节点为floor((i-1)/k); 0是根节点。
求这个树的所有节点为根的子树的节点数的异或和。
思路:模拟
可以发现k = min(k,n-1);即:k>=n-1时候结果一样。
然后画图可以发现是一个满k叉树(叶子不一定满)。
然后发现:如果这是一个叶子也满的k叉树,那么直接就可以计算出结果。
当不是叶子满的时候,可以发现它的某些地方是满的。那么想办法递归处理从上到下。
将那些满的取下来计算。剩下的继续递归。
当k=1的时候递归时间超限。
从1到n取异或和可以发现前i的前缀异或和有规律4为一周期。1,+1,0,原数; */
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <iostream>
#include <cmath>
#include <vector>
#include <map>
using namespace std;
typedef long long LL;
#define ms(x,y) memset(x,y,sizeof x)
typedef pair<int, int> P;
const LL INF = 1e10;
const int mod = 1e9 + ;
const int maxn = 3e5 + ;
map<LL,LL>mp;
void get(LL n,LL k,LL &h,LL &r)
{
LL p = ;
if(n==){
h = , r = ; return ;
}
n -= ;
for(int i = ; ; i++){
if(n==p*k){
h = i, r = ; return ;
}
if(n/k<p){///如果判断n<=k*p,那么可能要考虑取整。
h = i, r = n; return ;
}
/*if(log10(n)<log10(p)+log10(k)){
h = i, r = n;
return ;
}*/
p = p*k;
n -= p;
}
}
LL cal(LL h,LL k)
{
if(h==) return ;
LL p = ;
LL sum = ;
for(int i = ; i <= h; i++){
p *= k;
sum += p;
}
return sum;
}
void work(LL num,LL h,LL k)
{
if(num==) return ;
LL n = cal(h,k);
mp[n] += num;
n -= ;
while(n){
mp[n/k] += num*k;
n /= k;
n -= ;
}
}
LL Pow(LL a,LL b)
{
LL p = ;
while(b){
if(b&) p *= a;
a = a*a;
b >>= ;
}
return p;
}
void solve(LL n,LL k)
{
if(n==){
mp[]++;
return ;
}
LL h, r;
get(n,k,h,r);
if(r==){
work(,h,k); return ;
}
if(h==){
mp[n] += ;
mp[] += n-;
return ;
}
LL p = Pow(k,h-);
LL num;
if(r%p==) num = r/p;
else num = r/p+;
work(num-,h-,k);
work(k-num,h-,k);
mp[n]++;
solve(n-(num-)*cal(h-,k)-(k-num)*cal(h-,k)-,k); }
void test()///k=1时候的规律。
{
for(int i = ; i <= ; i++){
printf("%d: ",i);
int ans = ;
for(int j = ; j <= i; j++){
ans ^= j;
}
printf("%d\n",ans);
}
}
int main()
{
//freopen("YYnoGCD.in","r",stdin);
//freopen("YYnoGCD.out","w",stdout);
//freopen("in.txt","r",stdin);
int T;
//test();
LL n, k;
cin>>T;
while(T--)
{
scanf("%lld%lld",&n,&k);
LL ans = ;
if(k==){
if(n%==) ans = n;
if(n%==) ans = ;
if(n%==) ans = n+;
if(n%==) ans = ;
}else{
k = min(k,n-);
mp.clear();
solve(n,k);
map<LL,LL>::iterator it;
for(it = mp.begin(); it!=mp.end(); it++){
if((it->second)%){
ans ^= it->first;
}
}
}
cout<<ans<<endl;
}
return ;
}

hdu6121 Build a tree 模拟的更多相关文章

  1. hdu6121 Build a tree

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6121 题面: Build a tree Time Limit: 2000/1000 MS (J ...

  2. 【暴力】hdu6121 Build a tree

    给你n,K,让你构造出一颗n个结点的完全K叉树,求所有结点子树大小的异或和. 先把n号结点到根的路径提取出来单独计算.然后这条路径把每一层分成了左右两部分,每一层的左侧和其上一层的右侧的结点的子树大小 ...

  3. hdu6121 build a tree(树)

    题解: 可以考虑每一层结点的子树大小 必定满足下面的情况,即 a,a,a,a,a,a,b,c,c,c,c........ 然后每一层依次往上更新,结果是不变的 一共有logn层,所以依次扫上去,统计结 ...

  4. 【思维】2017多校训练七 HDU6121 Build a tree

    http://acm.hdu.edu.cn/showproblem.php?pid=6121 [题意] 询问n个结点的完全k叉树,所有子树结点个数的异或和是多少 [思路] 一棵完全K叉树,对于树的每一 ...

  5. HDU 6121 Build a tree(找规律+模拟)

    Build a tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)To ...

  6. 【hdu6121】 Build a tree 简单数学题

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6121 我好像推得挺久的诶..... 题目大意:给你一棵有$n$个点的树,根节点为$0$,对于其余节点 ...

  7. easyui Tree模拟级联勾选cascadeCheck,节点选择,父节点自动选中,节点取消,父节点自动取消选择,节点选择,所有子节点全部选择,节点取消,所有子节点全部取消勾选

    最近项目中用到easyui tree,发现tree控件的cascadeCheck有些坑,不像miniui 的tree控件,级联勾选符合业务需求,所以就自己重新改写了onCheck事件,符合业务需求.网 ...

  8. 2017ACM暑期多校联合训练 - Team 7 1002 HDU 6121 Build a tree (深搜+思维)

    题目链接 Problem Description HazelFan wants to build a rooted tree. The tree has n nodes labeled 0 to n− ...

  9. HDU 6121 Build a tree —— 2017 Multi-University Training 7

    HazelFan wants to build a rooted tree. The tree has nn nodes labeled 0 to n−1, and the father of the ...

随机推荐

  1. Voice Commands (VCD) Cortana 微软小娜示例

    Cortana 样品 您可以创建自定义功能Cortana使用Cortana技能装备或遗留的声音命令(VCD)平台. 在这里,你可以找到相关的样品: Cortana技能装备 目前Cortana技巧是建立 ...

  2. [Angular-Scaled Web] 6. Navigating between states with ui-router

    There are two ways to naviagting between state: 1. Using $state service, $state.go() 2. Using ui-ser ...

  3. (剑指Offer)面试题48:不能被继承的类

    题目: 写一个不能被继承的类 思路: 1.把构造函数设为私有函数 在C++中子类的构造函数会自动调用父类的构造函数,子类的析构函数也会自动调用父类的构造函数,要想一个类不能被继承,只要把它的构造函数和 ...

  4. KineticJS教程(12)

    KineticJS教程(12) 作者: ysm  12.舞台 12.1.舞台的大小 舞台创建后还可以用舞台对象的setSize(width, height)方法来设置舞台的宽度与高度. <scr ...

  5. 将图片转成base64字符串并在JSP页面显示的Java代码

    *本事例主要讲了如下几点:  * 1:将图片转换为BASE64加密字符串.  * 2:将图片流转换为BASE64加密字符串.  * 3:将BASE64加密字符串转换为图片. * 4:在jsp文件中以引 ...

  6. jsp标签(jsp动作元素)

    <jsp:forward page=”/index.jsp”></jsp:forward>也是跳转. 可以用来配置为首页,来启动某个servlet. <jsp:inclu ...

  7. Hbuilder 常用快捷键

    网上搜了一下,对Hbuider的快捷键 另外还有一些实用的组合键: Alt+T→V (检验语法文档) Alt+L→H (代码历史版本)

  8. Mybatis-Generator自动生成代码

    在使用mybatis开发的过程中,通常我们会给数据库的每张表编写对应的model.dao.mapping,虽然很简单,但是工作量很大,所以通常会使用代码生成器Mybatis-Generator帮我们自 ...

  9. 使用万网+阿里云服务器(Apache)配置二级域名

    1. 在万网域名解析中添加二级域名解析配置    在下面的主机记录(RR)的栏位添加二级域名名称后点确定按钮即可.     注:需要等一段时间才能生效,请留意万网域名解析列表的生效状态栏位. 2. 在 ...

  10. idea 编辑时cup飙升解决方案,亲测有效

    idea(64).exe.vmoptions内容如下: -Xms1024m -Xmx2048m -XX:MaxPermSize=512m -XX:ReservedCodeCacheSize=256m ...