HDU
来源:互联网 发布:淘宝男士夏装 编辑:程序博客网 时间:2024/06/10 23:08
题目大意:
给你一颗 n 个节点的完全 k 叉树,问你这棵树中所有子树结点个数的总异或值。
分析:
首先是一个比较常见的结论,对于任意两个数 x y:x=x^y^y;
所以对于一颗完全 k 叉树,假设它有 t 层,那么我可以将它分解成三份,一份是若干个 t-1 层的满 k 叉树,一份若干个 t-2 层的满 k 叉树,还有一颗 t-1 层的不满的完全 k 叉树。因为异或运算的特殊性质,我就根据满 k 叉树的个数的奇偶和层数 t 就可以以接近 t 的时间复杂度得到每一份的答案(如果初始化,就能在O(1)内得到了)。同时相当于减小了所求树的规模,还是以 k 分的速度减少,这就很快了。
最后要注意:k=1的时候要特判,就是输出几百个找下规律就好了。
代码:
#include<bits/stdc++.h>using namespace std;long long int n,k;long long int comf(long long int x)//对于一颗深度为 x 层的满树,返回它的异或值{ if(x<=0)return 0; if(x==1)return 1; long long int ans=1; if(k%2==0) { long long int temp=1; for(long long int i=1;i<x;i++) { temp*=k; ans+=temp; } } else { long long int temp=1; for(long long int i=1;i<=x;i++) { temp*=k; temp++; ans=ans^temp; } } return ans;}long long int sum(long long int x)//返回x层的满树有多少结点{ if(x<=0)return 0; if(x==1)return 1; long long int ans=1; for(long long int i=1;i<x;i++) { ans*=k; ans++; } return ans;}long long int f(long long int n)//对于一颗 k 叉树,返回他的异或值{ if(n==1)//只有一层 { return 1; } /*if(n==2) { return 1^2; }*/ long long int temp=n-1; long long int ln,rn; long long int x=1;//层数 while((temp-1)/k>0) { temp=(temp-1)/k; x++; } x++; if(n==sum(x))return comf(x); ln=temp-1; rn=k-temp; long long int ans=n; //cout<<temp<<endl; if(ln%2==1) { ans=ans^comf(x-1); } if(rn%2==1) { ans=ans^comf(x-2); } n=n-ln*sum(x-1)-rn*sum(x-2)-1; //cout<<x-2; //cout<<n; ans=ans^f(n); return ans;}int test=0;int main(){ /*test long long int ans=0; for(int i=1;i<=10000;i++) { ans=ans^i; printf("%d %lld\n",i,ans); } */ scanf("%d",&test); while(test--) { scanf("%lld%lld",&n,&k); if(k!=1)printf("%lld\n",f(n)); else printf("%lld\n",n%4==1?1:(n%4==2?n+1:(n%4==3?0:n))); }}
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- 几种常用的数据库连接池
- Unity3D内部串口通信和Unity3D与Winform程序的串口通信的实现和异常问题
- Zookeeper简单介绍分布式锁
- [题解]bzoj4034 HAOI2015 树上操作
- 安装Win10 + Linux双系统笔记
- HDU
- 2018.8.18梦中的凶杀案
- springboot之改变自动扫描的包
- SSH2框架整合--实现登录
- CPU的缓存L1、L2、L3
- MainActivity
- Gym
- 如何使用谷歌
- 数据库连接池c3p0介绍与使用